﻿///////////////////////////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2023, ООО 1С-Софт
// Все права защищены. Эта программа и сопроводительные материалы предоставляются 
// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0)
// Текст лицензии доступен по ссылке:
// https://creativecommons.org/licenses/by/4.0/legalcode
///////////////////////////////////////////////////////////////////////////////////////////////////////

#Область ОписаниеПеременных

&НаКлиенте
Перем ИсточникПеретаскиванияНаКлиенте;
&НаКлиенте
Перем ПриемникПеретаскиванияНаКлиенте;
&НаКлиенте
Перем Список_ПередНачаломИзменения;

#КонецОбласти

#Область ОбработчикиСобытийФормы

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
	УстановитьУсловноеОформление();
	
	ОпределитьПоведениеВМобильномКлиенте();
	
	ФормаПараметры = ВариантыОтчетов.СохраняемыеПараметрыФормыОтчета(Параметры);
	НастройкиОтчета = Параметры.НастройкиОтчета;
	ВариантНаименование = Параметры.ВариантНаименование;
	
	ОписаниеНастроекОтчета = ОписаниеНастроекОтчета(НастройкиОтчета);
	
	КлючСохраненияПоложенияОкна = ОписаниеНастроекОтчета.ПолноеИмя;
	Если ЗначениеЗаполнено(КлючТекущегоВарианта) Тогда
		КлючСохраненияПоложенияОкна = КлючСохраненияПоложенияОкна + "." + КлючТекущегоВарианта;
	КонецЕсли;
	
	НастройкиКД = Параметры.Вариант;
	Если НастройкиКД = Неопределено Тогда
		НастройкиКД = Отчет.КомпоновщикНастроек.Настройки;
	КонецЕсли;
	
	ИдентификаторЭлементаСтруктурыНастроек = Параметры.ИдентификаторЭлементаСтруктурыНастроек;
	Если ТипЗнч(ИдентификаторЭлементаСтруктурыНастроек) = Тип("ИдентификаторКомпоновкиДанных") Тогда
		РежимИзмененияЭлементаСтруктурыНастроек = Истина;
		Высота = 0;
		КлючСохраненияПоложенияОкна = КлючСохраненияПоложенияОкна + ".Узел";
		
		ПутьКЭлементуСтруктурыНастроек = ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры(
			Параметры, "ПутьКЭлементуСтруктурыНастроек");
		
		ЭлементСтруктуры = ОтчетыСервер.ЭлементНастроекПоПолномуПути(НастройкиКД, ПутьКЭлементуСтруктурыНастроек);
		Если ЭлементСтруктуры <> Неопределено Тогда
			ИдентификаторЭлементаСтруктурыНастроек = НастройкиКД.ПолучитьИдентификаторПоОбъекту(ЭлементСтруктуры);
		КонецЕсли;
		
		Заголовок = Параметры.Заголовок;
		ТипЭлементаСтруктурыНастроек = Параметры.ТипЭлементаСтруктурыНастроек;
	Иначе
		Если Не ЗначениеЗаполнено(ВариантНаименование) Тогда
			ВариантНаименование = ОписаниеНастроекОтчета.Наименование;
		КонецЕсли;
		
		Заголовок = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
			НСтр("ru = 'Настройки отчета ""%1""'"), ВариантНаименование);
	КонецЕсли;
	
	ГлобальныеНастройки = ВариантыОтчетов.ГлобальныеНастройки();
	Элементы.ОформлениеНастроитьКолонтитулы.Видимость =
		ГлобальныеНастройки.ВыводитьИндивидуальныеНастройкиКолонтитулов
		И Не РежимИзмененияЭлементаСтруктурыНастроек
		И (Не ОбщегоНазначения.РазделениеВключено() Или ОбщегоНазначения.ДоступноИспользованиеРазделенныхДанных());
	
	Если РежимИзмененияЭлементаСтруктурыНастроек Тогда
		ИмяСтраницы = ?(ПустаяСтрока(Параметры.ИмяСтраницы), "СтраницаСоставГруппировки", Параметры.ИмяСтраницы);
		РасширенныйРежим = 1;
	Иначе
		РасширенныйРежим = ОписаниеНастроекОтчета.ФормаНастроекРасширенныйРежим;
		ИмяСтраницы = ОписаниеНастроекОтчета.ФормаНастроекИмяСтраницы;
	КонецЕсли;
	
	Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ЦентрМониторинга") Тогда 
		
		// Подсчитываем количество созданий формы, стандартный разделитель ".".
		ТекущиеРежим = Элементы.РасширенныйРежим.СписокВыбора.НайтиПоЗначению(РасширенныйРежим);
		Комментарий = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = '%1 режим'"), ТекущиеРежим.Представление);
		
		МодульЦентрМониторинга = ОбщегоНазначения.ОбщийМодуль("ЦентрМониторинга");
		МодульЦентрМониторинга.ЗаписатьОперациюБизнесСтатистики("ОбщаяФорма.ФормаНастроекОтчета", 1, Комментарий);
		
	КонецЕсли;
	
	Страница = Элементы.Найти(ИмяСтраницы);
	Если Страница <> Неопределено Тогда
		Элементы.СтраницыНастроек.ТекущаяСтраница = Страница;
	КонецЕсли;
	
	Если ОписаниеНастроекОтчета.СхемаМодифицирована Тогда
		Отчет.КомпоновщикНастроек.Инициализировать(Новый ИсточникДоступныхНастроекКомпоновкиДанных(ОписаниеНастроекОтчета.АдресСхемы));
	КонецЕсли;
	
	ШрифтВажнойНадписи = Метаданные.ЭлементыСтиля.ВажнаяНадписьШрифт;
	Элементы.СтруктураВариантаЗаголовок.Шрифт = ШрифтВажнойНадписи.Значение;
	
	// Регистрация команд и реквизитов формы, которые не удаляются при перезаполнении быстрых настроек.
	НаборРеквизитов = ПолучитьРеквизиты();
	Для Каждого Реквизит Из НаборРеквизитов Цикл
		ПостоянныеРеквизиты.Добавить(ПолноеИмяРеквизита(Реквизит));
	КонецЦикла;
	
	Для Каждого Команда Из Команды Цикл
		ПостоянныеКоманды.Добавить(Команда.Имя);
	КонецЦикла;
	
	НеобходимоОбновитьНастройки = Истина;
КонецПроцедуры

&НаСервере
Процедура ПередЗагрузкойВариантаНаСервере(НовыеНастройкиКД)
	
	Если ВариантыОтчетов.ДопустимоУстановитьКонтекст(ЭтотОбъект)
	   И ТипЗнч(ФормаПараметры.Отбор) = Тип("Структура") Тогда
		
		ОтчетыСервер.УстановитьФиксированныеОтборы(ФормаПараметры.Отбор, НовыеНастройкиКД, НастройкиОтчета);
	КонецЕсли;
	
	НеобходимоОбновитьНастройки = Истина;
	
	// Подготовка к вызову события переинициализации.
	Если НастройкиОтчета.События.ПередЗагрузкойНастроекВКомпоновщик Тогда
		Попытка
			НовыеНастройкиXML = ОбщегоНазначения.ЗначениеВСтрокуXML(НовыеНастройкиКД);
		Исключение
			НовыеНастройкиXML = Неопределено;
		КонецПопытки;
		НастройкиОтчета.НовыеНастройкиXML = НовыеНастройкиXML;
	КонецЕсли;
КонецПроцедуры

&НаСервере
Процедура ПередЗагрузкойПользовательскихНастроекНаСервере(НовыеПользовательскиеНастройкиКД)
	
	НеобходимоОбновитьНастройки = Истина;
	
	// Подготовка к вызову события переинициализации.
	Если НастройкиОтчета.События.ПередЗагрузкойНастроекВКомпоновщик Тогда
		Попытка
			НовыеПользовательскиеНастройкиXML = ОбщегоНазначения.ЗначениеВСтрокуXML(НовыеПользовательскиеНастройкиКД);
		Исключение
			НовыеПользовательскиеНастройкиXML = Неопределено;
		КонецПопытки;
		НастройкиОтчета.НовыеПользовательскиеНастройкиXML = НовыеПользовательскиеНастройкиXML;
	КонецЕсли;
КонецПроцедуры

&НаСервере
Процедура ПриОбновленииСоставаПользовательскихНастроекНаСервере(СтандартнаяОбработка)
	
	СтандартнаяОбработка = Ложь;
	ВариантМодифицирован = Ложь;
	
	Если НеобходимоОбновитьНастройки Тогда
		НеобходимоОбновитьНастройки = Ложь;
		
		ПараметрыЗаполнения = Новый Структура;
		ПараметрыЗаполнения.Вставить("ИмяСобытия", "ПриСозданииНаСервере");
		ПараметрыЗаполнения.Вставить("ОбновитьНастройкиВарианта", Не РежимИзмененияЭлементаСтруктурыНастроек И РасширенныйРежим = 1);
		
		ОбновитьФорму(ПараметрыЗаполнения);
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура ПередЗакрытием(Отказ, ЗавершениеРаботы, ТекстПредупреждения, СтандартнаяОбработка)
	ВариантМодифицирован = Ложь;
	
	Если РезультатВыбораСформирован Тогда
		СтандартнаяОбработка = Ложь;
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура ПриЗакрытии(ЗавершениеРаботы)
	Если ЗавершениеРаботы Тогда
		Возврат;
	КонецЕсли;
	
	Если РезультатВыбораСформирован Тогда
		Возврат;
	КонецЕсли;
	
	Если ОписаниеОповещенияОЗакрытии <> Неопределено Тогда
		ВыполнитьОбработкуОповещения(ОписаниеОповещенияОЗакрытии, РезультатВыбора(Ложь));
	КонецЕсли;
КонецПроцедуры

#КонецОбласти

#Область ОбработчикиСобытийЭлементовШапкиФормы

&НаКлиенте
Процедура РасширенныйРежимПриИзменении(Элемент)
	Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.ЦентрМониторинга") Тогда
		
		// Подсчитываем количество переключений режима, стандартный разделитель ".".
		МодульЦентрМониторингаКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("ЦентрМониторингаКлиент");
		МодульЦентрМониторингаКлиент.ЗаписатьОперациюБизнесСтатистики("ОбщаяФорма.ФормаНастроекОтчета.РасширенныйРежим.ПриИзменении", 1);
		
	КонецЕсли;
	
	ПараметрыОбновления = Новый Структура;
	ПараметрыОбновления.Вставить("ИмяСобытия", "РасширенныйРежимПриИзменении");
	ПараметрыОбновления.Вставить("КомпоновщикНастроекКД", Отчет.КомпоновщикНастроек);
	ПараметрыОбновления.Вставить("ОбновитьНастройкиВарианта", РасширенныйРежим = 1);
	ПараметрыОбновления.Вставить("СброситьПользовательскиеНастройки", РасширенныйРежим <> 1);
	
	ОбновитьФорму(ПараметрыОбновления);
КонецПроцедуры

&НаКлиенте
Процедура ПредупрежденияОбОтсутствииПользовательскихНастроекОбработкаНавигационнойСсылки(Элемент, НавигационнаяСсылкаФорматированнойСтроки, СтандартнаяОбработка)
	СтандартнаяОбработка = Ложь;
	РасширенныйРежим = 1;
	РасширенныйРежимПриИзменении(Неопределено);
КонецПроцедуры

&НаКлиенте
Процедура ТекущийТипДиаграммыПриИзменении(Элемент)
	ЭлементСтруктуры = Отчет.КомпоновщикНастроек.Настройки.ПолучитьОбъектПоИдентификатору(ИдентификаторЭлементаСтруктурыНастроек);
	Если ТипЗнч(ЭлементСтруктуры) = Тип("НастройкиВложенногоОбъектаКомпоновкиДанных") Тогда
		ЭлементСтруктуры = ЭлементСтруктуры.Настройки;
	КонецЕсли;
	
	УстановитьПараметрВывода(ЭлементСтруктуры, "ТипДиаграммы", ТекущийТипДиаграммы);
	УстановитьМодифицированность();
КонецПроцедуры

&НаКлиенте
Процедура ПодсказкаЕстьВложенныеОтчетыОбработкаНавигационнойСсылки(Элемент, Адрес, СтандартнаяОбработка)
	СтандартнаяОбработка = Ложь;
	Строка = Элементы.СтруктураВарианта.ТекущиеДанные;
	ИзменитьЭлементСтруктуры(Строка,, Истина);
КонецПроцедуры

&НаКлиенте
Процедура ВыводитьЗаголовокПриИзменении(Элемент)
	ПредопределенныеПараметры = Отчет.КомпоновщикНастроек.Настройки.ПараметрыВывода.Элементы;
	
	ЭлементНастройки = ПредопределенныеПараметры.Найти("TITLE");
	ЭлементНастройки.Использование = ВыводитьЗаголовок;
	
	СинхронизироватьПредопределенныеПараметрыВывода(ВыводитьЗаголовок, ЭлементНастройки);
	УстановитьМодифицированность();
КонецПроцедуры

&НаКлиенте
Процедура ВыводитьФильтрыПриИзменении(Элемент)
	ПредопределенныеПараметры = Отчет.КомпоновщикНастроек.Настройки.ПараметрыВывода.Элементы;
	
	ЭлементНастройки = ПредопределенныеПараметры.Найти("DATAPARAMETERSOUTPUT");
	ЭлементНастройки.Использование = Истина;
	
	Если ВыводитьФильтры Тогда 
		ЭлементНастройки.Значение = ТипВыводаТекстаКомпоновкиДанных.Авто;
	Иначе
		ЭлементНастройки.Значение = ТипВыводаТекстаКомпоновкиДанных.НеВыводить;
	КонецЕсли;
	
	СинхронизироватьПредопределенныеПараметрыВывода(ВыводитьФильтры, ЭлементНастройки);
	УстановитьМодифицированность();
КонецПроцедуры

////////////////////////////////////////////////////////////////////////////////
// Подключаемые

&НаКлиенте
Процедура Подключаемый_Период_ПриИзменении(Элемент)
	ОтчетыКлиент.УстановитьПериод(ЭтотОбъект, Элемент.Имя);
КонецПроцедуры

&НаКлиенте
Процедура Подключаемый_ЭлементНастройки_ПриИзменении(Элемент)
	КомпоновщикНастроек = Отчет.КомпоновщикНастроек;
	
	Индекс = ПутьКДаннымЭлементов.ПоИмени[Элемент.Имя];
	Если Индекс = Неопределено Тогда 
		Индекс = ОтчетыКлиентСервер.ИндексЭлементаНастройкиПоПути(Элемент.Имя);
	КонецЕсли;
	
	ЭлементНастройки = КомпоновщикНастроек.ПользовательскиеНастройки.Элементы[Индекс];
	
	ЭтоФлажок = СтрНачинаетсяС(Элемент.Имя, "Флажок") Или СтрЗаканчиваетсяНа(Элемент.Имя, "Флажок");
	Если ЭтоФлажок Тогда 
		ЭлементНастройки.Значение = ЭтотОбъект[Элемент.Имя];
	КонецЕсли;
	
	Если ТипЗнч(ЭлементНастройки) = Тип("ЗначениеПараметраНастроекКомпоновкиДанных")
		И НастройкиОтчета.ЗагрузитьНастройкиПриИзмененииПараметров.Найти(ЭлементНастройки.Параметр) <> Неопределено Тогда 
		
		ПараметрыОбновления = Новый Структура;
		ПараметрыОбновления.Вставить("КомпоновщикНастроекКД", КомпоновщикНастроек);
		
		ОбновитьФорму(ПараметрыОбновления);
	Иначе
		ОформитьСписок(Элемент, ЭлементНастройки);
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура Подключаемый_Список_ПриИзменении(Элемент)
	КомпоновщикНастроек = Отчет.КомпоновщикНастроек;
	
	Индекс = ПутьКДаннымЭлементов.ПоИмени[Элемент.Имя];
	ЭлементНастройки = КомпоновщикНастроек.ПользовательскиеНастройки.Элементы[Индекс];
	
	Список = ЭтотОбъект[Элемент.Имя];
	ВыбранныеЗначения = Новый СписокЗначений;
	Для Каждого ЭлементСписка Из Список Цикл 
		Если ЭлементСписка.Пометка Тогда 
			ЗаполнитьЗначенияСвойств(ВыбранныеЗначения.Добавить(), ЭлементСписка);
		КонецЕсли;
	КонецЦикла;
	
	Если ТипЗнч(ЭлементНастройки) = Тип("ЗначениеПараметраНастроекКомпоновкиДанных") Тогда 
		ЭлементНастройки.Значение = ВыбранныеЗначения;
	ИначеЕсли ТипЗнч(ЭлементНастройки) = Тип("ЭлементОтбораКомпоновкиДанных") Тогда 
		ЭлементНастройки.ПравоеЗначение = ВыбранныеЗначения;
	КонецЕсли;
	ЭлементНастройки.Использование = Истина;
	
	ОтчетыКлиент.КэшироватьЗначениеОтбора(КомпоновщикНастроек, ЭлементНастройки, Список);
	
	ОформитьСписок(Элемент, ЭлементНастройки);
КонецПроцедуры

&НаКлиенте
Процедура Подключаемый_Список_ПередНачаломДобавления(Элемент, Отказ, Копирование, Родитель, Группа, Параметр)
	
	ПутьКСписку = Элемент.Имя;
	ЭлементСписка = Элементы[Элемент.Имя + "Значение"];
	
	ПараметрыЗаполнения = ПараметрыЗаполненияСписка(Истина, Ложь);
	ПараметрыЗаполнения.ПутьКСписку = ПутьКСписку;
	ПараметрыЗаполнения.Индекс = ПутьКДаннымЭлементов.ПоИмени[ПутьКСписку];
	
	ВыборПереопределен = Ложь;
	НачатьЗаполнениеСписка(ЭлементСписка, ПараметрыЗаполнения, ВыборПереопределен);
	
	Если ВыборПереопределен Тогда
		Отказ = Истина;
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура Подключаемый_Список_ПередНачаломИзменения(Элемент, Отказ)
	
	Список_ПередНачаломИзменения = Элемент;
	
	ЭлементСписка = Элементы[Элемент.Имя + "Значение"];
	ЭлементСписка.РедактированиеТекста = Ложь;
	ПодключитьОбработчикОжидания("Список_ПриНачалеИзменения", 0.1, Истина);
	
КонецПроцедуры

&НаКлиенте
Процедура Подключаемый_Список_ОбработкаВыбора(Элемент, РезультатВыбора, СтандартнаяОбработка)
	СтандартнаяОбработка = Ложь;
	
	Список = ЭтотОбъект[Элемент.Имя];
	
	Выбранные = ОтчетыКлиентСервер.ЗначенияСписком(РезультатВыбора);
	Выбранные.ЗаполнитьПометки(Истина);
	
	Дополнение = ОбщегоНазначенияКлиентСервер.ДополнитьСписок(Список, Выбранные, Ложь, Истина);
	
	ЗначениеЭлементаНастройки = ОбщегоНазначенияКлиент.СкопироватьРекурсивно(Список);
	Индекс = ЗначениеЭлементаНастройки.Количество() - 1;
	Пока Индекс >= 0 Цикл 
		ТекущееЗначение = ЗначениеЭлементаНастройки[Индекс];
		
		Если Не ТекущееЗначение.Пометка Тогда 
			ЗначениеЭлементаНастройки.Удалить(ТекущееЗначение);
		КонецЕсли;
		
		Индекс = Индекс - 1;
	КонецЦикла;
	
	Индекс = ПутьКДаннымЭлементов.ПоИмени[Элемент.Имя];
	КомпоновщикНастроек = Отчет.КомпоновщикНастроек;
	ЭлементНастройки = КомпоновщикНастроек.ПользовательскиеНастройки.Элементы[Индекс];
	
	Если ТипЗнч(ЭлементНастройки) = Тип("ЗначениеПараметраНастроекКомпоновкиДанных") Тогда
		ЭлементНастройки.Значение = ЗначениеЭлементаНастройки;
	Иначе
		ЭлементНастройки.ПравоеЗначение = ЗначениеЭлементаНастройки;
	КонецЕсли;
	ЭлементНастройки.Использование = Истина;
	
	ОформитьСписок(Элемент, ЭлементНастройки);
	
	Если Дополнение.Всего > 0 Тогда
		Если Дополнение.Всего = 1 Тогда
			ЗаголовокОповещения = НСтр("ru = 'Элемент добавлен в список'");
		Иначе
			ЗаголовокОповещения = НСтр("ru = 'Элементы добавлены в список'");
		КонецЕсли;
		
		ПоказатьОповещениеПользователя(
			ЗаголовокОповещения,,
			Строка(Выбранные),
			БиблиотекаКартинок.ВыполнитьЗадачу);
	КонецЕсли;
	
	ОтчетыКлиент.КэшироватьЗначениеОтбора(КомпоновщикНастроек, ЭлементНастройки, Список);
	
	УстановитьМодифицированность();
КонецПроцедуры

&НаКлиенте
Процедура Подключаемый_ПометкаЭлементаСписка_ПриИзменении(Элемент)
	
	ОтключитьОбработчикОжидания("Список_ПриНачалеИзменения");
	Список_ПередНачаломИзменения.ЗакончитьРедактированиеСтроки(Истина);
	
КонецПроцедуры

&НаКлиенте
Процедура Подключаемый_ЭлементСписка_ПриИзменении(Элемент)
	ПутьКСписку = СтрЗаменить(Элемент.Имя, "Значение", "");
	
	Строка = Элементы[ПутьКСписку].ТекущиеДанные;
	
	ЭлементСписка = ЭтотОбъект[ПутьКСписку].НайтиПоЗначению(Строка.Значение);
	ЭлементСписка.Пометка = Истина;
КонецПроцедуры

&НаКлиенте
Процедура Подключаемый_ЭлементСписка_НачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
	СтандартнаяОбработка = Ложь;
	
	ПутьКСписку = СтрЗаменить(Элемент.Имя, "Значение", "");
	
	ПараметрыЗаполнения = ПараметрыЗаполненияСписка(Истина, Ложь, Ложь);
	ПараметрыЗаполнения.ПутьКСписку = ПутьКСписку;
	ПараметрыЗаполнения.Индекс = ПутьКДаннымЭлементов.ПоИмени[ПутьКСписку];
	ПараметрыЗаполнения.Владелец = Элемент;
	
	ТекущееЗначение = Элементы[ПутьКСписку].ТекущиеДанные.Значение;
	Если ТекущееЗначение <> Неопределено Тогда
		Сведения = ОтчетыКлиент.СведенияОЭлементеНастройки(Отчет.КомпоновщикНастроек, ПараметрыЗаполнения.Индекс);
		ПользовательскиеНастройки = Отчет.КомпоновщикНастроек.ПользовательскиеНастройки.Элементы;
		ПараметрыВыбора = ОтчетыКлиентСервер.ПараметрыВыбора(Сведения.Настройки, ПользовательскиеНастройки, Сведения.Элемент);
		ПараметрыЗаполнения.Вставить("ПараметрыВыбора", ПараметрыВыбора);
		ПараметрыЗаполнения.Вставить("ТекущаяСтрока", ТекущееЗначение);
		
		СписокТипов = Новый СписокЗначений;
		СписокТипов.Добавить(ТипЗнч(ТекущееЗначение));
		ПродолжитьЗаполнениеСписка(СписокТипов[0], ПараметрыЗаполнения);
		Возврат;
	КонецЕсли;
		
	НачатьЗаполнениеСписка(Элемент, ПараметрыЗаполнения);
КонецПроцедуры

#КонецОбласти

#Область ОбработчикиСобытийЭлементовТаблицыФормыСортировка

&НаКлиенте
Процедура СортировкаВыбор(Элемент, ИдентификаторСтроки, Поле, СтандартнаяОбработка)
	СтандартнаяОбработка = Ложь;
	
	Строка = Элементы.Сортировка.ТекущиеДанные;
	Если Строка = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	Если ТипЗнч(Строка.Поле) = Тип("ПолеКомпоновкиДанных") Тогда
		Если Поле = Элементы.СортировкаПоле Тогда // Изменение поля
			#Если Не МобильныйКлиент Тогда
				СортировкаВыбратьПоле(ИдентификаторСтроки, Строка);
			#КонецЕсли
		ИначеЕсли Поле = Элементы.СортировкаТипУпорядочивания Тогда // Изменение порядка.
			ИзменитьТипУпорядочивания(Строка);
		КонецЕсли;
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура СортировкаПередНачаломДобавления(Элемент, Отказ, Копирование, Родитель, Группа, Параметр)
	Отказ = Истина;
	
	Если Копирование Тогда
		СкопироватьНастройки(Элемент);
		Возврат;
	КонецЕсли;
	
	ВыбратьПоле("Сортировка", Новый ОписаниеОповещения("СортировкаПослеВыбораПоля", ЭтотОбъект));
КонецПроцедуры

&НаКлиенте
Процедура СортировкаПередУдалением(Элемент, Отказ)
	УдалитьСтроки(Элемент, Отказ);
КонецПроцедуры

&НаКлиенте
Процедура СортировкаИспользованиеПриИзменении(Элемент)
	ИзменитьИспользованиеЭлементаНастройки("Сортировка");
КонецПроцедуры

&НаКлиенте
Процедура Сортировка_ПоУбыванию(Команда)
	ИзменитьТипУпорядочиванияСтрок(НаправлениеСортировкиКомпоновкиДанных.Убыв);
КонецПроцедуры

&НаКлиенте
Процедура Сортировка_ПоВозрастанию(Команда)
	ИзменитьТипУпорядочиванияСтрок(НаправлениеСортировкиКомпоновкиДанных.Возр);
КонецПроцедуры

&НаКлиенте
Процедура Сортировка_ПереместитьВверх(Команда)
	СдвинутьСортировку();
КонецПроцедуры

&НаКлиенте
Процедура Сортировка_ПереместитьВниз(Команда)
	СдвинутьСортировку(Ложь);
КонецПроцедуры

&НаКлиенте
Процедура Сортировка_УстановитьФлажки(Команда)
	ИзменитьИспользование("Сортировка");
КонецПроцедуры

&НаКлиенте
Процедура Сортировка_СнятьФлажки(Команда)
	ИзменитьИспользование("Сортировка", Ложь);
КонецПроцедуры

&НаКлиенте
Процедура СортировкаНачалоПеретаскивания(Элемент, ПараметрыПеретаскивания, РазрешитьПеретаскивание)
	ИсточникПеретаскиванияНаКлиенте = Элемент.Имя;
КонецПроцедуры

&НаКлиенте
Процедура СортировкаПроверкаПеретаскивания(Элемент, ПараметрыПеретаскивания, СтандартнаяОбработка, ТекущаяСтрока, Поле)
	ПриемникПеретаскиванияНаКлиенте = Элемент.Имя;
	
	Если ПараметрыПеретаскивания.Значение.Количество() > 0 Тогда 
		СтандартнаяОбработка = Ложь;
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура СортировкаПеретаскивание(Элемент, ПараметрыПеретаскивания, СтандартнаяОбработка, ТекущаяСтрока, Поле)
	СтандартнаяОбработка = Ложь;
	Если ИсточникПеретаскиванияНаКлиенте = Элемент.Имя Тогда 
		ПеретащитьСортировкуВнутриКоллекции(ПараметрыПеретаскивания, ТекущаяСтрока);
	ИначеЕсли ИсточникПеретаскиванияНаКлиенте = Элементы.ВыбранныеПоля.Имя Тогда 
		ПеретащитьВыбранныеПоляВСортировку(ПараметрыПеретаскивания.Значение);
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура СортировкаОкончаниеПеретаскивания(Элемент, ПараметрыПеретаскивания, СтандартнаяОбработка)
	СтандартнаяОбработка = Ложь;
КонецПроцедуры

&НаКлиенте
Процедура ВыбранныеПоля_Сортировка_Вправо(Команда)
	ИдентификаторыСтрок = Элементы.ВыбранныеПоля.ВыделенныеСтроки;
	Если ИдентификаторыСтрок = Неопределено Тогда 
		Возврат;
	КонецЕсли;
	
	Строки = Новый Массив;
	Для Каждого ИдентификаторСтроки Из ИдентификаторыСтрок Цикл 
		Строка = ВыбранныеПоля.НайтиПоИдентификатору(ИдентификаторСтроки);
		Если ТипЗнч(Строка.Идентификатор) = Тип("ИдентификаторКомпоновкиДанных") Тогда 
			Строки.Добавить(Строка);
		КонецЕсли;
	КонецЦикла;
	
	ПеретащитьВыбранныеПоляВСортировку(Строки);
КонецПроцедуры

&НаКлиенте
Процедура ВыбранныеПоля_Сортировка_Влево(Команда)
	ИдентификаторыСтрок = Элементы.Сортировка.ВыделенныеСтроки;
	Если ИдентификаторыСтрок = Неопределено Тогда 
		Возврат;
	КонецЕсли;
	
	Строки = Новый Массив;
	Для Каждого ИдентификаторСтроки Из ИдентификаторыСтрок Цикл 
		Строка = Сортировка.НайтиПоИдентификатору(ИдентификаторСтроки);
		Если ТипЗнч(Строка.Идентификатор) = Тип("ИдентификаторКомпоновкиДанных") Тогда 
			Строки.Добавить(Строка);
		КонецЕсли;
	КонецЦикла;
	
	ПеретащитьПоляСортировкиВВыбранныеПоля(Строки);
КонецПроцедуры

&НаКлиенте
Процедура ВыбранныеПоля_Сортировка_ВлевоВсе(Команда)
	ПеретащитьПоляСортировкиВВыбранныеПоля(Сортировка.ПолучитьЭлементы()[0].ПолучитьЭлементы());
КонецПроцедуры

&НаКлиенте
Процедура ВыбранныеПоля_ГруппаИ(Команда)
	ИдентификаторСтроки = Элементы.Отборы.ТекущаяСтрока;
	Если ИдентификаторСтроки <> Неопределено Тогда
		ОтборыПослеВыбораГруппы(ТипГруппыЭлементовОтбораКомпоновкиДанных.ГруппаИ, ИдентификаторСтроки);
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура ВыбранныеПоля_ГруппаИли(Команда)
	ИдентификаторСтроки = Элементы.Отборы.ТекущаяСтрока;
	Если ИдентификаторСтроки <> Неопределено Тогда
		ОтборыПослеВыбораГруппы(ТипГруппыЭлементовОтбораКомпоновкиДанных.ГруппаИли, ИдентификаторСтроки);
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура ВыбранныеПоля_ГруппаНе(Команда)
	ИдентификаторСтроки = Элементы.Отборы.ТекущаяСтрока;
	Если ИдентификаторСтроки <> Неопределено Тогда
		ОтборыПослеВыбораГруппы(ТипГруппыЭлементовОтбораКомпоновкиДанных.ГруппаНе, ИдентификаторСтроки);
	КонецЕсли;
КонецПроцедуры

#КонецОбласти

#Область ОбработчикиСобытийЭлементовТаблицыФормыВыбранныеПоля

&НаКлиенте
Процедура ВыбранныеПоляВыбор(Элемент, ИдентификаторСтроки, Поле, СтандартнаяОбработка)
	СтандартнаяОбработка = Ложь;
#Если МобильныйКлиент Тогда
	Возврат;
#КонецЕсли
	
	Строка = Элементы.ВыбранныеПоля.ТекущиеДанные;
	Если Строка = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	Если Поле = Элементы.ВыбранныеПоляПоле Тогда // Изменение порядка.
		Если ТипЗнч(Строка.Поле) = Тип("ПолеКомпоновкиДанных") Тогда
			ВыбранныеПоляВыбратьПоле(ИдентификаторСтроки, Строка);
		ИначеЕсли Строка.ЭтоГруппа Тогда
			ВыбранныеПоляВыбратьГруппу(ИдентификаторСтроки, Строка);
		КонецЕсли;
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура ВыбранныеПоляПриАктивизацииСтроки(Элемент)
	ПодключитьОбработчикОжидания("ПослеАктивизацииВыбранныхПолей", 0.1, Истина);
КонецПроцедуры

&НаКлиенте
Процедура ВыбранныеПоляПередУдалением(Элемент, Отказ)
	Если РасширенныйРежим = 0 Тогда
		Отказ = Истина;
		Возврат;
	КонецЕсли;
	УдалитьСтроки(Элемент, Отказ);
КонецПроцедуры

&НаКлиенте
Процедура ВыбранныеПоляИспользованиеПриИзменении(Элемент)
	ИзменитьИспользованиеЭлементаНастройки("ВыбранныеПоля");
КонецПроцедуры

&НаКлиенте
Процедура ВыбранныеПоля_ПереместитьВверх(Команда)
	СдвинутьВыбранныеПоля();
КонецПроцедуры

&НаКлиенте
Процедура ВыбранныеПоля_ПереместитьВниз(Команда)
	СдвинутьВыбранныеПоля(Ложь);
КонецПроцедуры

&НаКлиенте
Процедура ВыбранныеПоля_Сгруппировать(Команда)
	ПараметрыГруппировки = ПараметрыГруппировкиВыбранныхПолей();
	Если ПараметрыГруппировки = Неопределено Тогда 
		Возврат;
	КонецЕсли;
	
	ПараметрыФормы = Новый Структура("Расположение", РасположениеПоляКомпоновкиДанных.Авто);
	Обработчик = Новый ОписаниеОповещения("ВыбранныеПоляПередГруппировкойПолей", ЭтотОбъект, ПараметрыГруппировки);
	ОткрытьФорму("ХранилищеНастроек.ХранилищеВариантовОтчетов.Форма.ГруппаВыбранныхПолей", ПараметрыФормы, 
		ЭтотОбъект, УникальныйИдентификатор,,, Обработчик, РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);
КонецПроцедуры

&НаКлиенте
Процедура ВыбранныеПоля_Разгруппировать(Команда)
	ИдентификаторыСтрок = Элементы.ВыбранныеПоля.ВыделенныеСтроки;
	Если ИдентификаторыСтрок.Количество() <> 1 Тогда 
		ПоказатьПредупреждение(, НСтр("ru = 'Выберите одну группу.'"));
		Возврат;
	КонецЕсли;
	
	РодительСтрокиИсточника = ВыбранныеПоля.НайтиПоИдентификатору(ИдентификаторыСтрок[0]);
	Если ТипЗнч(РодительСтрокиИсточника.Идентификатор) <> Тип("ИдентификаторКомпоновкиДанных") Тогда 
		ПоказатьПредупреждение(, НСтр("ru = 'Выберите группу.'"));
		Возврат;
	КонецЕсли;
	
	СвойствоЭлементаСтруктуры = СвойствоЭлементаСтруктурыНастроек(
		Отчет.КомпоновщикНастроек, "Выбор", ИдентификаторЭлементаСтруктурыНастроек, РасширенныйРежим);
	
	РодительЭлементаНастройкиИсточника = СвойствоЭлементаСтруктуры.ПолучитьОбъектПоИдентификатору(РодительСтрокиИсточника.Идентификатор);
	Если ТипЗнч(РодительЭлементаНастройкиИсточника) <> Тип("ГруппаВыбранныхПолейКомпоновкиДанных") Тогда 
		ПоказатьПредупреждение(, НСтр("ru = 'Выберите группу.'"));
		Возврат;
	КонецЕсли;
	
	РодительЭлементаНастройкиПриемника = РодительЭлементаНастройкиИсточника.Родитель;
	Если РодительЭлементаНастройкиИсточника.Родитель = Неопределено Тогда 
		РодительЭлементаНастройкиПриемника = СвойствоЭлементаСтруктуры;
	КонецЕсли;
	
	НаследникиЭлементовНастроек = Новый Соответствие;
	НаследникиЭлементовНастроек.Вставить(РодительЭлементаНастройкиИсточника, РодительЭлементаНастройкиПриемника);
	
	РодительСтрокиПриемника = РодительСтрокиИсточника.ПолучитьРодителя();
	НаследникиСтрок = Новый Соответствие;
	НаследникиСтрок.Вставить(РодительСтрокиИсточника, РодительСтрокиПриемника);
	
	ИзменитьГруппировкуВыбранныхПолей(СвойствоЭлементаСтруктуры, РодительСтрокиИсточника.ПолучитьЭлементы(), НаследникиЭлементовНастроек, НаследникиСтрок);
	
	// Удаление базовых элементов группировки.
	РодительСтрокиПриемника.ПолучитьЭлементы().Удалить(РодительСтрокиИсточника);
	РодительЭлементаНастройкиПриемника.Элементы.Удалить(РодительЭлементаНастройкиИсточника);
	
	Раздел = ВыбранныеПоля.ПолучитьЭлементы()[0];
	Элементы.ВыбранныеПоля.Развернуть(Раздел.ПолучитьИдентификатор(), Истина);
	Элементы.ВыбранныеПоля.ТекущаяСтрока = РодительСтрокиПриемника.ПолучитьИдентификатор();
	
	УстановитьМодифицированность();
КонецПроцедуры

&НаКлиенте
Процедура ВыбранныеПоля_УстановитьФлажки(Команда)
	ИзменитьИспользование("ВыбранныеПоля");
КонецПроцедуры

&НаКлиенте
Процедура ВыбранныеПоля_СнятьФлажки(Команда)
	ИзменитьИспользование("ВыбранныеПоля", Ложь);
КонецПроцедуры

&НаКлиенте
Процедура ВыбранныеПоляНачалоПеретаскивания(Элемент, ПараметрыПеретаскивания, РазрешитьПеретаскивание)
	ИсточникПеретаскиванияНаКлиенте = Элемент.Имя;
	
	ПроверитьПеретаскиваемыеСтрокиИзВыбранныхПолей(ПараметрыПеретаскивания.Значение);
	Если ПараметрыПеретаскивания.Значение.Количество() = 0 Тогда 
		РазрешитьПеретаскивание = Ложь;
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура ВыбранныеПоляПроверкаПеретаскивания(Элемент, ПараметрыПеретаскивания, СтандартнаяОбработка, ТекущаяСтрока, Поле)
	
	ТекущиеДанные = ВыбранныеПоля.НайтиПоИдентификатору(ТекущаяСтрока);
	Если ТекущиеДанные.ЭтоРаздел Или ТекущиеДанные.ЭтоГруппа Тогда
		СтрокаПриемник = ТекущиеДанные;
	Иначе
		СтрокаПриемник = ТекущиеДанные.ПолучитьРодителя();
	КонецЕсли;
	
	Для Каждого ИдентификаторСтроки Из ПараметрыПеретаскивания.Значение Цикл 
		СтрокаПеретаскивание = ВыбранныеПоля.НайтиПоИдентификатору(ИдентификаторСтроки);
		Если ЭтоПодчиненныеЭлементы(СтрокаПеретаскивание, СтрокаПриемник) Тогда
			ПараметрыПеретаскивания.Действие = ДействиеПеретаскивания.Отмена;
			Возврат;
		КонецЕсли;
	КонецЦикла;
	
	ПриемникПеретаскиванияНаКлиенте = Элемент.Имя;
	
	Если ПараметрыПеретаскивания.Значение.Количество() > 0 Тогда 
		СтандартнаяОбработка = Ложь;
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура ВыбранныеПоляПеретаскивание(Элемент, ПараметрыПеретаскивания, СтандартнаяОбработка, ТекущаяСтрока, Поле)
	
	Если ПараметрыПеретаскивания.Действие = ДействиеПеретаскивания.Отмена Тогда
		Возврат;
	КонецЕсли;
	
	СтандартнаяОбработка = Ложь;
	
	Если ИсточникПеретаскиванияНаКлиенте = Элемент.Имя Тогда 
		ПеретащитьВыбранныеПоляВПределахКоллекции(ПараметрыПеретаскивания, ТекущаяСтрока);
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура ВыбранныеПоляОкончаниеПеретаскивания(Элемент, ПараметрыПеретаскивания, СтандартнаяОбработка)

	Если ПараметрыПеретаскивания.Действие = ДействиеПеретаскивания.Отмена Тогда
		Возврат;
	КонецЕсли;
	
	Если ПриемникПеретаскиванияНаКлиенте <> Элемент.Имя Тогда 
		Возврат;
	КонецЕсли;
	
	СтандартнаяОбработка = Ложь;
	
	СвойствоЭлементаСтруктуры = СвойствоЭлементаСтруктурыНастроек(
		Отчет.КомпоновщикНастроек, "Выбор", ИдентификаторЭлементаСтруктурыНастроек, РасширенныйРежим);
	
	Строки = ПараметрыПеретаскивания.Значение;
	Родитель = Строки[0].ПолучитьРодителя();
	
	Индекс = Строки.ВГраница();
	Пока Индекс >= 0 Цикл 
		Строка = Строки[Индекс];
		
		ЭлементНастройки = ЭлементНастройки(СвойствоЭлементаСтруктуры, Строка);
		РодительЭлементаНастройки = СвойствоЭлементаСтруктуры;
		Если ЭлементНастройки.Родитель <> Неопределено Тогда 
			РодительЭлементаНастройки = ЭлементНастройки.Родитель;
		КонецЕсли;
		
		РодительЭлементаНастройки.Элементы.Удалить(ЭлементНастройки);
		Родитель.ПолучитьЭлементы().Удалить(Строка);
		
		Индекс = Индекс - 1;
	КонецЦикла;
КонецПроцедуры

#КонецОбласти

#Область ОбработчикиСобытийЭлементовТаблицыФормыОтборы

&НаКлиенте
Процедура Отборы_Сгруппировать(Команда)
	ПараметрыГруппировки = ПараметрыГруппировкиОтборов();
	Если ПараметрыГруппировки = Неопределено Тогда 
		Возврат;
	КонецЕсли;
	
	СвойствоЭлементаСтруктуры = СвойствоЭлементаСтруктурыНастроек(
		Отчет.КомпоновщикНастроек, "Отбор", ИдентификаторЭлементаСтруктурыНастроек);
	
	// Обработка элементов настроек.
	ЭлементНастройкиИсточник = СвойствоЭлементаСтруктуры;
	Если ТипЗнч(ПараметрыГруппировки.Родитель.Идентификатор) = Тип("ИдентификаторКомпоновкиДанных") Тогда 
		ЭлементНастройкиИсточник = СвойствоЭлементаСтруктуры.ПолучитьОбъектПоИдентификатору(ПараметрыГруппировки.Родитель.Идентификатор);
	КонецЕсли;
	
	ЭлементНастройкиПриемник = ЭлементНастройкиИсточник.Элементы.Вставить(ПараметрыГруппировки.Индекс, Тип("ГруппаЭлементовОтбораКомпоновкиДанных"));
	ЭлементНастройкиПриемник.ИдентификаторПользовательскойНастройки = Новый УникальныйИдентификатор;
	ЭлементНастройкиПриемник.РежимОтображения = РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Недоступный;
	
	НаследникиЭлементовНастроек = Новый Соответствие;
	НаследникиЭлементовНастроек.Вставить(ЭлементНастройкиИсточник, ЭлементНастройкиПриемник);
	
	// Обработка строк.
	СтрокаИсточник = ПараметрыГруппировки.Родитель;
	ЭлементыИсточника = СтрокаИсточник.ПолучитьЭлементы();
	СтрокаПриемник = ЭлементКоллекцииФормыНастроек(СтрокаИсточник);
	СтрокаПриемник = ЭлементыИсточника.Вставить(ПараметрыГруппировки.Индекс); // см. ЭлементКоллекцииФормыНастроек
	УстановитьДанныеСтрокиОтборов(СтрокаПриемник, СвойствоЭлементаСтруктуры, ЭлементНастройкиПриемник);
	СтрокаПриемник.Идентификатор = СвойствоЭлементаСтруктуры.ПолучитьИдентификаторПоОбъекту(ЭлементНастройкиПриемник);
	
	НаследникиСтрок = Новый Соответствие;
	НаследникиСтрок.Вставить(СтрокаИсточник, СтрокаПриемник);
	
	ИзменитьГруппировкуОтборов(СвойствоЭлементаСтруктуры, ПараметрыГруппировки.Строки, НаследникиЭлементовНастроек, НаследникиСтрок);
	УдалитьБазовыеЭлементыГруппировкиОтборов(СвойствоЭлементаСтруктуры, ПараметрыГруппировки);
	
	Раздел = КорневаяСтрокаПоУмолчанию("Отборы");
	Элементы.Отборы.Развернуть(Раздел.ПолучитьИдентификатор(), Истина);
	Элементы.Отборы.ТекущаяСтрока = СтрокаПриемник.ПолучитьИдентификатор();
	
	УстановитьМодифицированность();
КонецПроцедуры

&НаКлиенте
Процедура Отборы_Разгруппировать(Команда)
	ИдентификаторыСтрок = Элементы.Отборы.ВыделенныеСтроки;
	Если ИдентификаторыСтрок.Количество() <> 1 Тогда 
		ПоказатьПредупреждение(, НСтр("ru = 'Выберите одну группу.'"));
		Возврат;
	КонецЕсли;
	
	РодительСтрокиИсточника = Отборы.НайтиПоИдентификатору(ИдентификаторыСтрок[0]);
	Если ТипЗнч(РодительСтрокиИсточника.Идентификатор) <> Тип("ИдентификаторКомпоновкиДанных") Тогда 
		ПоказатьПредупреждение(, НСтр("ru = 'Выберите группу.'"));
		Возврат;
	КонецЕсли;
	
	СвойствоЭлементаСтруктуры = СвойствоЭлементаСтруктурыНастроек(
		Отчет.КомпоновщикНастроек, "Отбор", ИдентификаторЭлементаСтруктурыНастроек);
	
	РодительЭлементаНастройкиИсточника = СвойствоЭлементаСтруктуры.ПолучитьОбъектПоИдентификатору(РодительСтрокиИсточника.Идентификатор);
	Если ТипЗнч(РодительЭлементаНастройкиИсточника) <> Тип("ГруппаЭлементовОтбораКомпоновкиДанных") Тогда 
		ПоказатьПредупреждение(, НСтр("ru = 'Выберите группу.'"));
		Возврат;
	КонецЕсли;
	
	РодительЭлементаНастройкиПриемника = РодительЭлементаНастройкиИсточника.Родитель;
	Если РодительЭлементаНастройкиИсточника.Родитель = Неопределено Тогда 
		РодительЭлементаНастройкиПриемника = СвойствоЭлементаСтруктуры;
	КонецЕсли;
	
	НаследникиЭлементовНастроек = Новый Соответствие;
	НаследникиЭлементовНастроек.Вставить(РодительЭлементаНастройкиИсточника, РодительЭлементаНастройкиПриемника);
	
	РодительСтрокиПриемника = РодительСтрокиИсточника.ПолучитьРодителя();
	НаследникиСтрок = Новый Соответствие;
	НаследникиСтрок.Вставить(РодительСтрокиИсточника, РодительСтрокиПриемника);
	
	ИзменитьГруппировкуОтборов(СвойствоЭлементаСтруктуры, РодительСтрокиИсточника.ПолучитьЭлементы(), НаследникиЭлементовНастроек, НаследникиСтрок);
	
	// Удаление базовых элементов группировки.
	РодительСтрокиПриемника.ПолучитьЭлементы().Удалить(РодительСтрокиИсточника);
	РодительЭлементаНастройкиПриемника.Элементы.Удалить(РодительЭлементаНастройкиИсточника);
	
	Раздел = КорневаяСтрокаПоУмолчанию("Отборы");
	Элементы.Отборы.Развернуть(Раздел.ПолучитьИдентификатор(), Истина);
	Элементы.Отборы.ТекущаяСтрока = РодительСтрокиПриемника.ПолучитьИдентификатор();
	
	УстановитьМодифицированность();
КонецПроцедуры

&НаКлиенте
Процедура Отборы_ПереместитьВверх(Команда)
	СдвинутьОтборы();
КонецПроцедуры

&НаКлиенте
Процедура Отборы_ПереместитьВниз(Команда)
	СдвинутьОтборы(Ложь);
КонецПроцедуры

&НаКлиенте
Процедура Отборы_УстановитьФлажки(Команда)
	ИзменитьИспользование("Параметры");
	ИзменитьИспользование("Отборы");
КонецПроцедуры

&НаКлиенте
Процедура Отборы_СнятьФлажки(Команда)
	ИзменитьИспользование("Параметры", Ложь);
	ИзменитьИспользование("Отборы", Ложь);
КонецПроцедуры

&НаКлиенте
Процедура Отборы_ПоказыватьВШапкеОтчета(Команда)
	ОтборыУстановитьРежимОтображения("ПоказыватьВШапкеОтчета");
КонецПроцедуры

&НаКлиенте
Процедура Отборы_ПоказыватьВНастройкахОтчета(Команда)
	ОтборыУстановитьРежимОтображения("ПоказыватьВНастройкахОтчета");
КонецПроцедуры

&НаКлиенте
Процедура Отборы_ПоказыватьТолькоФлажокВШапкеОтчета(Команда)
	ОтборыУстановитьРежимОтображения("ПоказыватьТолькоФлажокВШапкеОтчета");
КонецПроцедуры

&НаКлиенте
Процедура Отборы_ПоказыватьТолькоФлажокВНастройкахОтчета(Команда)
	ОтборыУстановитьРежимОтображения("ПоказыватьТолькоФлажокВНастройкахОтчета");
КонецПроцедуры

&НаКлиенте
Процедура Отборы_НеПоказывать(Команда)
	ОтборыУстановитьРежимОтображения("НеПоказывать");
КонецПроцедуры

&НаКлиенте
Процедура ОтборыВыбор(Элемент, ИдентификаторСтроки, Поле, СтандартнаяОбработка)
	Строка = Элементы.Отборы.ТекущиеДанные;
	Если Строка = Неопределено Или Строка.ЭтоРаздел Тогда
		Возврат;
	КонецЕсли;
	
	Если Поле = Элементы.ОтборыПоле Или Поле = Элементы.ОтборыПараметр Или Поле = Элементы.ОтборыТипГруппы Тогда 
		СтандартнаяОбработка = Ложь;
		Если Строка.ЭтоПараметр Тогда 
			Возврат;
		КонецЕсли;
		Если Строка.ЭтоГруппа Тогда 
			ОтборыВыбратьГруппу(ИдентификаторСтроки);
		КонецЕсли;

	ИначеЕсли Поле = Элементы.ОтборыКартинкаРежимаОтображения Тогда // Изменение быстрого доступа к отбору.
		СтандартнаяОбработка = Ложь;
		Если Строка.ЭтоПараметр Тогда 
			СвойствоЭлементаСтруктуры = СвойствоЭлементаСтруктурыНастроек(Отчет.КомпоновщикНастроек, "ПараметрыДанных");
		Иначе
			СвойствоЭлементаСтруктуры = СвойствоЭлементаСтруктурыНастроек(Отчет.КомпоновщикНастроек, "Отбор", ИдентификаторЭлементаСтруктурыНастроек);
		КонецЕсли;
		ВыбратьРежимОтображенияДляСтроки(СвойствоЭлементаСтруктуры, "Отборы", ИдентификаторСтроки, Истина, Не Строка.ЭтоПараметр);
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура ОтборыПриАктивизацииСтроки(Элемент)
	УстановитьПараметрыРедактированияЭлементаОтбора();
	ПодключитьОбработчикОжидания("ОтборыПриИзмененииТекущейСтроки", 0.1, Истина);
КонецПроцедуры

&НаКлиенте
Процедура ОтборыПриАктивизацииЯчейки(Элемент)
	Строка = Элемент.ТекущиеДанные;
	Если Строка = Неопределено Тогда 
		Возврат;
	КонецЕсли;
	
	ЭтоПолеСписка = Строка.ДоступенСписокЗначений Или ОтчетыКлиентСервер.ЭтоВидСравненияСписка(Строка.ВидСравнения);
	
	ПолеЗначения = ?(Строка.ЭтоПараметр, Элементы.ОтборыЗначение, Элементы.ОтборыПравоеЗначение);
	ПолеЗначения.ОграничениеТипа = ?(ЭтоПолеСписка, Новый ОписаниеТипов("СписокЗначений"), Строка.ТипЗначения);
	ПолеЗначения.РежимВыбораИзСписка = Не ЭтоПолеСписка И (Строка.ДоступныеЗначения <> Неопределено);
	
	ПривестиЗначениеКВидуСравнения(Строка);
	УстановитьПредставлениеЗначения(Строка);
КонецПроцедуры

&НаКлиенте
Процедура ОтборыПередНачаломДобавления(Элемент, Отказ, Копирование, Родитель, Группа, Параметр)
	Отказ = Истина;
	
	Если Копирование Тогда
		СкопироватьНастройки(Элемент);
		Возврат;
	КонецЕсли;
	
	ОтборыПередВыборомПоля();
КонецПроцедуры

&НаКлиенте
Процедура ОтборыПолеНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
	СтандартнаяОбработка = Ложь;
	ОтборыПередВыборомПоля(Элементы.Отборы.ТекущаяСтрока);
КонецПроцедуры

&НаКлиенте
Процедура ОтборыПолеОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка)
	Если ВыбранноеЗначение = Неопределено Тогда 
		Возврат;
	КонецЕсли;
	
	СвойствоЭлементаСтруктуры = СвойствоЭлементаСтруктурыНастроек(
		Отчет.КомпоновщикНастроек, "Отбор", ИдентификаторЭлементаСтруктурыНастроек);
	
	ОписаниеНастройки = СвойствоЭлементаСтруктуры.ДоступныеПоляОтбора.НайтиПоле(ВыбранноеЗначение);
	ИдентификаторСтроки = Элементы.Отборы.ТекущаяСтрока;
	
	ОтборыПослеВыбораПоля(ОписаниеНастройки, ИдентификаторСтроки);
КонецПроцедуры

&НаКлиенте
Процедура ОтборыПолеАвтоПодбор(Элемент, Текст, ДанныеВыбора, ПараметрыПолученияДанных, Ожидание, СтандартнаяОбработка)
	
	Запрос = СокрЛП(Текст);
	
	Если Не ЗначениеЗаполнено(Запрос) Тогда 
		Возврат;
	КонецЕсли;
	
	Строка = Элементы.Отборы.ТекущиеДанные;
	
	Если Строка = Неопределено
		Или Строка.ЭтоРаздел
		Или Строка.ЭтоГруппа
		Или Строка.ЭтоПараметр Тогда
		
		Возврат;
	КонецЕсли;
	
	СтандартнаяОбработка = Ложь;
	
	СвойствоЭлементаСтруктуры = СвойствоЭлементаСтруктурыНастроек(
		Отчет.КомпоновщикНастроек, "Отбор", ИдентификаторЭлементаСтруктурыНастроек);
	
	ДоступныеПоля = СвойствоЭлементаСтруктуры.ДоступныеПоляОтбора;
	ОпределитьДанныеВыбораЭлементаОтбораПоЗапросу(Запрос, ДанныеВыбора, ДоступныеПоля);
	
КонецПроцедуры

&НаКлиенте
Процедура ОтборыПередУдалением(Элемент, Отказ)
	УдалитьСтроки(Элемент, Отказ);
КонецПроцедуры

&НаКлиенте
Процедура ОтборыИспользованиеПриИзменении(Элемент)
	ИзменитьИспользованиеЭлементаНастройки("Отборы");
КонецПроцедуры

&НаКлиенте
Процедура ОтборыВидСравненияПриИзменении(Элемент)
	Строка = Элементы.Отборы.ТекущиеДанные;
	Если Строка = Неопределено Тогда 
		Возврат;
	КонецЕсли;
	
	КлючСвойства = КлючСвойстваЭлементаСтруктурыНастроек("Отборы", Строка);
	СвойствоЭлементаСтруктуры = СвойствоЭлементаСтруктурыНастроек(
		Отчет.КомпоновщикНастроек, КлючСвойства, ИдентификаторЭлементаСтруктурыНастроек, РасширенныйРежим);
	
	ЭлементНастройки = ЭлементНастройки(СвойствоЭлементаСтруктуры, Строка);
	ЭлементНастройки.ВидСравнения = Строка.ВидСравнения;
	
	Если Строка.ЭтоПараметр Тогда 
		Условие = ВидСравненияКомпоновкиДанных.Равно;
		Если Строка.ДоступенСписокЗначений Тогда 
			Условие = ВидСравненияКомпоновкиДанных.ВСписке;
		КонецЕсли;
	Иначе
		Условие = Строка.ВидСравнения;
	КонецЕсли;
	
	ПолеЗначения = ?(Строка.ЭтоПараметр, Элементы.ОтборыЗначение, Элементы.ОтборыПравоеЗначение);
	ПолеЗначения.ВыборГруппИЭлементов = ОтчетыКлиентСервер.ЗначениеТипаГруппыИЭлементы(Строка.ВыборГруппИЭлементов, Условие);
	
	ПривестиЗначениеКВидуСравнения(Строка, ЭлементНастройки);
	УстановитьМодифицированность();
КонецПроцедуры

&НаКлиенте
Процедура ОтборыЗначениеПриИзменении(Элемент)
	Строка = Элементы.Отборы.ТекущиеДанные;
	Если Строка = Неопределено Тогда 
		Возврат;
	КонецЕсли;
	
	СвойствоЭлементаСтруктуры = СвойствоЭлементаСтруктурыНастроек(Отчет.КомпоновщикНастроек, "ПараметрыДанных");
	ЭлементНастройки = ЭлементНастройки(СвойствоЭлементаСтруктуры, Строка);
	ЭлементНастройки.Значение = Строка.Значение;
	
	УстановитьМодифицированность();
	УстановитьПредставлениеЗначения(Строка);
	
	Если НастройкиОтчета.ЗагрузитьНастройкиПриИзмененииПараметров.Найти(ЭлементНастройки.Параметр) <> Неопределено Тогда 
		ВариантБылМодифицирован = ВариантМодифицирован;
		Отчет.КомпоновщикНастроек.Настройки.ДополнительныеСвойства.Вставить("ОтчетИнициализирован", Ложь);
		ВариантМодифицирован = ВариантБылМодифицирован;
		
		ПараметрыОбновления = Новый Структура;
		ПараметрыОбновления.Вставить("КомпоновщикНастроекКД", Отчет.КомпоновщикНастроек);
		ПараметрыОбновления.Вставить("ВариантМодифицирован", ВариантМодифицирован);
		ПараметрыОбновления.Вставить("ПользовательскиеНастройкиМодифицированы", ПользовательскиеНастройкиМодифицированы);
		ПараметрыОбновления.Вставить("СброситьПользовательскиеНастройки", Истина);
		
		ОбновитьФорму(ПараметрыОбновления);
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура ОтборыЗначениеНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
	Строка = Элементы.Отборы.ТекущиеДанные;
	УстановитьПараметрыРедактирования(Строка);
	
	Если ВыборПереопределен(Строка, СтандартнаяОбработка) Тогда
		Возврат;
	КонецЕсли;
	
	Если Строка.ДоступенСписокЗначений Тогда 
		ПоказатьСписокВыбора(Строка, СтандартнаяОбработка, Элемент);
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура ОтборыПравоеЗначениеПриИзменении(Элемент)
	Строка = Элементы.Отборы.ТекущиеДанные;
	Если Строка = Неопределено Тогда 
		Возврат;
	КонецЕсли;
	
	Строка.Использование = Истина;
	
	СвойствоЭлементаСтруктуры = СвойствоЭлементаСтруктурыНастроек(
		Отчет.КомпоновщикНастроек, "Отбор", ИдентификаторЭлементаСтруктурыНастроек);
	
	ЭлементНастройки = ЭлементНастройки(СвойствоЭлементаСтруктуры, Строка);
	ЗаполнитьЗначенияСвойств(ЭлементНастройки, Строка, "Использование, ПравоеЗначение");
	
	УстановитьМодифицированность();
	УстановитьПредставлениеЗначения(Строка);
КонецПроцедуры

&НаКлиенте
Процедура ОтборыПравоеЗначениеНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
	Строка = Элементы.Отборы.ТекущиеДанные;
	УстановитьПараметрыРедактирования(Строка);
	
	Если ВыборПереопределен(Строка, СтандартнаяОбработка) Тогда
		Возврат;
	КонецЕсли;
	
	Если ОтчетыКлиентСервер.ЭтоВидСравненияСписка(Строка.ВидСравнения) Тогда 
		ПоказатьСписокВыбора(Строка, СтандартнаяОбработка, Элемент);
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура ОтборыПредставлениеПользовательскойНастройкиПриИзменении(Элемент)
	Строка = Элементы.Отборы.ТекущиеДанные;
	Если Строка = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	Если ПустаяСтрока(Строка.ПредставлениеПользовательскойНастройки) Тогда
		Строка.ПредставлениеПользовательскойНастройки = Строка.Заголовок;
	КонецЕсли;
	Строка.ЭтоПредопределенныйЗаголовок = (Строка.Заголовок = Строка.ПредставлениеПользовательскойНастройки);
	
	Если Строка.ЭтоПараметр Тогда 
		СвойствоЭлементаСтруктуры = СвойствоЭлементаСтруктурыНастроек(Отчет.КомпоновщикНастроек, "ПараметрыДанных");
	Иначе
		СвойствоЭлементаСтруктуры = СвойствоЭлементаСтруктурыНастроек(
			Отчет.КомпоновщикНастроек, "Отбор", ИдентификаторЭлементаСтруктурыНастроек);
	КонецЕсли;
	
	ЭлементНастройки = ЭлементНастройки(СвойствоЭлементаСтруктуры, Строка);
	Если Строка.ЭтоПредопределенныйЗаголовок Тогда
		ЭлементНастройки.ПредставлениеПользовательскойНастройки = "";
	Иначе
		ЭлементНастройки.ПредставлениеПользовательскойНастройки = Строка.ПредставлениеПользовательскойНастройки;
	КонецЕсли;
	
	Если Не Строка.ЭтоПараметр Тогда
		Если Строка.КартинкаРежимаОтображения = 1 Или Строка.КартинкаРежимаОтображения = 3 Тогда
			// Когда ПредставлениеПользовательскойНастройки заполнено,
			// то Представление работает как переключатель,
			// но также может использоваться для вывода в табличный документ.
			ЭлементНастройки.Представление = Строка.ПредставлениеПользовательскойНастройки;
		Иначе
			ЭлементНастройки.Представление = "";
		КонецЕсли;
	КонецЕсли;
	
	УстановитьМодифицированность();
КонецПроцедуры

&НаКлиенте
Процедура ОтборыНачалоПеретаскивания(Элемент, ПараметрыПеретаскивания, РазрешитьПеретаскивание)
	ИсточникПеретаскиванияНаКлиенте = Элемент.Имя;
	
	ПроверитьПеретаскиваемыеСтрокиИзОтборов(ПараметрыПеретаскивания.Значение);
	Если ПараметрыПеретаскивания.Значение.Количество() = 0 Тогда 
		РазрешитьПеретаскивание = Ложь;
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура ОтборыПроверкаПеретаскивания(Элемент, ПараметрыПеретаскивания, СтандартнаяОбработка, ТекущаяСтрока, Поле)
	
	Если ТекущаяСтрока = Неопределено Тогда
		ПараметрыПеретаскивания.Действие = ДействиеПеретаскивания.Отмена;
		Возврат;
	КонецЕсли;
	
	Строка = Отборы.НайтиПоИдентификатору(ТекущаяСтрока);
	Родитель = Строка.ПолучитьРодителя(); 
	Если (Родитель <> Неопределено И Родитель.Идентификатор = "ПараметрыДанных") 
		ИЛИ Строка.Идентификатор = "ПараметрыДанных" Тогда
		ПараметрыПеретаскивания.Действие = ДействиеПеретаскивания.Отмена;
		Возврат;
	КонецЕсли;

	ТекущиеДанные = Отборы.НайтиПоИдентификатору(ТекущаяСтрока);
	Если ТекущиеДанные.ЭтоРаздел Или ТекущиеДанные.ЭтоГруппа Тогда
		СтрокаПриемник = ТекущиеДанные;
	Иначе
		СтрокаПриемник = ТекущиеДанные.ПолучитьРодителя();
	КонецЕсли;
	
	Для Каждого ИдентификаторСтроки Из ПараметрыПеретаскивания.Значение Цикл 
		СтрокаПеретаскивание = Отборы.НайтиПоИдентификатору(ИдентификаторСтроки);
		Если ЭтоПодчиненныеЭлементы(СтрокаПеретаскивание, СтрокаПриемник) Тогда
			ПараметрыПеретаскивания.Действие = ДействиеПеретаскивания.Отмена;
			Возврат;
		КонецЕсли;
	КонецЦикла;

	ПриемникПеретаскиванияНаКлиенте = Элемент.Имя;
	
	Если ПараметрыПеретаскивания.Значение.Количество() > 0 Тогда 
		СтандартнаяОбработка = Ложь;
	КонецЕсли;

КонецПроцедуры

&НаКлиенте
Процедура ОтборыПеретаскивание(Элемент, ПараметрыПеретаскивания, СтандартнаяОбработка, ТекущаяСтрока, Поле)
	
	Если ПараметрыПеретаскивания.Действие = ДействиеПеретаскивания.Отмена Тогда
		Возврат;
	КонецЕсли;
	
	СтандартнаяОбработка = Ложь;
	
	Если ИсточникПеретаскиванияНаКлиенте = Элемент.Имя Тогда 
		ПеретащитьОтборыВПределахКоллекции(ПараметрыПеретаскивания, ТекущаяСтрока);
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура ОтборыОкончаниеПеретаскивания(Элемент, ПараметрыПеретаскивания, СтандартнаяОбработка)
	
	Если ПараметрыПеретаскивания.Действие = ДействиеПеретаскивания.Отмена Тогда
		Возврат;
	КонецЕсли;
	
	Если ПриемникПеретаскиванияНаКлиенте <> Элемент.Имя Тогда 
		Возврат;
	КонецЕсли;
	
	СтандартнаяОбработка = Ложь;
	
	СвойствоЭлементаСтруктуры = СвойствоЭлементаСтруктурыНастроек(
		Отчет.КомпоновщикНастроек, "Отбор", ИдентификаторЭлементаСтруктурыНастроек, РасширенныйРежим);
	
	Строки = ПараметрыПеретаскивания.Значение;
	Родитель = Строки[0].ПолучитьРодителя();
	
	Индекс = Строки.ВГраница();
	Пока Индекс >= 0 Цикл 
		Строка = Строки[Индекс];
		
		ЭлементНастройки = ЭлементНастройки(СвойствоЭлементаСтруктуры, Строка);
		РодительЭлементаНастройки = СвойствоЭлементаСтруктуры;
		Если ЭлементНастройки.Родитель <> Неопределено Тогда 
			РодительЭлементаНастройки = ЭлементНастройки.Родитель;
		КонецЕсли;
		
		РодительЭлементаНастройки.Элементы.Удалить(ЭлементНастройки);
		Родитель.ПолучитьЭлементы().Удалить(Строка);
		
		Индекс = Индекс - 1;
	КонецЦикла;
	
КонецПроцедуры

#КонецОбласти

#Область ОбработчикиСобытийЭлементовТаблицыФормыВыбранныеПоля

&НаКлиенте
Процедура ИзменитьФормулу(Команда)
	
	Строка = Элементы.ВыбранныеПоля.ТекущиеДанные;
	
	Если Строка = Неопределено Или Не Строка.ЭтоФормула Тогда 
		Возврат;
	КонецЕсли;

	Формула = ВариантыОтчетовСлужебныйКлиентСервер.ФормулаПоПутиКДанным(Отчет.КомпоновщикНастроек.Настройки, Строка(Строка.Поле));
	
	Если ТипЗнч(Формула) <> Тип("ПользовательскоеПолеВыражениеКомпоновкиДанных") Тогда
		ОписаниеОповещения = Новый ОписаниеОповещения("ПриЗакрытииФормыНастроекДляТехническогоСпециалиста", ЭтотОбъект);
		ОткрытьФормуНастроекДляТехническогоСпециалиста("СтраницаПользовательскихПолей", ОписаниеОповещения);
		Возврат;
	КонецЕсли;
		
	ВариантыОтчетовСлужебныйКлиент.ИзменитьФормулу(
		ЭтотОбъект, Отчет.КомпоновщикНастроек.Настройки, Строка(Строка.Поле));
	
КонецПроцедуры

// Параметры:
//  ОписаниеФормулы - ДоступноеПолеКомпоновкиДанных
//                  - Структура:
//                      * Наименование - Строка
//                      * ПредставлениеФормулы - Строка
//                      * Формула - Строка
//  Формула - Структура:
//    * КоллекцияПолей - ДоступныеПоляКомпоновкиДанных
//    * Формула - ПользовательскоеПолеВыражениеКомпоновкиДанных
//
&НаКлиенте
Процедура ПослеИзмененияФормулы(ОписаниеФормулы, Формула) Экспорт 
	
	Если ТипЗнч(ОписаниеФормулы) <> Тип("Структура") Тогда 
		Возврат;
	КонецЕсли;
	
	ВариантыОтчетовСлужебныйКлиент.ПослеИзмененияФормулы(ОписаниеФормулы, Формула);
	
	Строка = Элементы.ВыбранныеПоля.ТекущиеДанные; // ДанныеФормыЭлементДерева
	
	Если Строка <> Неопределено Тогда 
		Строка.Заголовок = ОписаниеФормулы.Заголовок;
	КонецЕсли;
	
	УстановитьМодифицированность();
	
КонецПроцедуры

#КонецОбласти

#Область ОбработчикиСобытийЭлементовТаблицыФормыСтруктураВарианта

&НаКлиенте
Процедура СтруктураВариантаПриАктивизацииСтроки(Элемент)
	ПодключитьОбработчикОжидания("СтруктураВариантаПриИзмененииТекущейСтроки", 0.1, Истина);
КонецПроцедуры

&НаКлиенте
Процедура СтруктураВариантаВыбор(Элемент, СтрокаИдентификатор, Поле, СтандартнаяОбработка)
	Если РасширенныйРежим = 0 Тогда
		СтандартнаяОбработка = Ложь;
		Возврат;
	КонецЕсли;
	
	Строка = Элемент.ТекущиеДанные;
	Если Строка = Неопределено Тогда
		СтандартнаяОбработка = Ложь;
		Возврат;
	КонецЕсли;
	
	Если Строка.Тип = "НастройкиКомпоновкиДанных"
		Или Строка.Тип = "КоллекцияЭлементовСтруктурыТаблицыКомпоновкиДанных"
		Или Строка.Тип = "КоллекцияЭлементовСтруктурыДиаграммыКомпоновкиДанных" Тогда
		СтандартнаяОбработка = Ложь;
		Возврат;
	КонецЕсли;
	
	Если Поле = Элементы.СтруктураВариантаПредставление
		Или Поле = Элементы.СтруктураВариантаСодержитОтборы
		Или Поле = Элементы.СтруктураВариантаСодержитПоляИлиСортировки
		Или Поле = Элементы.СтруктураВариантаСодержитУсловноеОформление Тогда
		
		СтандартнаяОбработка = Ложь;
		ИмяСтраницы = Неопределено;
		Если Поле = Элементы.СтруктураВариантаСодержитОтборы Тогда
			ИмяСтраницы = "СтраницаОтборы";
		ИначеЕсли Поле = Элементы.СтруктураВариантаСодержитПоляИлиСортировки Тогда
			ИмяСтраницы = "СтраницаВыбранныеПоляИСортировки";
		ИначеЕсли Поле = Элементы.СтруктураВариантаСодержитУсловноеОформление Тогда
			ИмяСтраницы = "СтраницаОформление";
		КонецЕсли;
		ИзменитьЭлементСтруктуры(Строка, ИмяСтраницы);
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура СтруктураВариантаПередНачаломДобавления(Элемент, Отказ, Копирование, Родитель, Группа, Параметр)
	Отказ = Истина;
	
	Если Не Элементы.СтруктураВарианта_Добавить.Доступность Тогда
		Возврат;
	КонецЕсли;
	
	Если Копирование Тогда
		СкопироватьНастройки(Элемент);
		Возврат;
	КонецЕсли;
	
	ДобавитьГруппировкуСтруктурыВарианта();
КонецПроцедуры

&НаКлиенте
Процедура СтруктураВарианта_Сгруппировать(Команда)
	Если Элементы.СтруктураВарианта_Сгруппировать.Доступность Тогда
		ДобавитьГруппировкуСтруктурыВарианта(Ложь);
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура СтруктураВарианта_ДобавитьТаблицу(Команда)
	Если Элементы.СтруктураВарианта_ДобавитьТаблицу.Доступность Тогда
		ДобавитьЭлементСтруктурыНастроек(Тип("ТаблицаКомпоновкиДанных"));
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура СтруктураВарианта_ДобавитьДиаграмму(Команда)
	Если Элементы.СтруктураВарианта_ДобавитьДиаграмму.Доступность Тогда
		ДобавитьЭлементСтруктурыНастроек(Тип("ДиаграммаКомпоновкиДанных"));
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура СтруктураВарианта_УстановитьФлажки(Команда)
	ИзменитьИспользование("СтруктураВарианта");
КонецПроцедуры

&НаКлиенте
Процедура СтруктураВарианта_СнятьФлажки(Команда)
	ИзменитьИспользование("СтруктураВарианта", Ложь);
КонецПроцедуры

&НаКлиенте
Процедура СтруктураВариантаНачалоПеретаскивания(Элемент, ПараметрыПеретаскивания, СтандартнаяОбработка)
	// Проверка общих условий.
	Если РасширенныйРежим = 0 Тогда
		СтандартнаяОбработка = Ложь;
		Возврат;
	КонецЕсли;
	// Проверка источника.
	Строка = СтруктураВарианта.НайтиПоИдентификатору(ПараметрыПеретаскивания.Значение);
	Если Строка = Неопределено Тогда
		СтандартнаяОбработка = Ложь;
		Возврат;
	КонецЕсли;
	Если Строка.Тип = "КоллекцияЭлементовСтруктурыДиаграммыКомпоновкиДанных"
		Или Строка.Тип = "КоллекцияЭлементовСтруктурыТаблицыКомпоновкиДанных"
		Или Строка.Тип = "НастройкиКомпоновкиДанных" Тогда
		СтандартнаяОбработка = Ложь;
		Возврат;
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура СтруктураВариантаПроверкаПеретаскивания(Элемент, ПараметрыПеретаскивания, СтандартнаяОбработка, ИдентификаторЦели, Поле)
	// Проверка общих условий.
	Если ИдентификаторЦели = Неопределено Тогда
		ПараметрыПеретаскивания.Действие = ДействиеПеретаскивания.Отмена;
		Возврат;
	КонецЕсли;
	// Проверка источника.
	Строка = СтруктураВарианта.НайтиПоИдентификатору(ПараметрыПеретаскивания.Значение);
	Если Строка = Неопределено Тогда
		ПараметрыПеретаскивания.Действие = ДействиеПеретаскивания.Отмена;
		Возврат;
	КонецЕсли;
	// Проверка приемника.
	НовыйРодитель = СтруктураВарианта.НайтиПоИдентификатору(ИдентификаторЦели);
	Если НовыйРодитель = Неопределено Тогда
		ПараметрыПеретаскивания.Действие = ДействиеПеретаскивания.Отмена;
		Возврат;
	КонецЕсли;
	Если НовыйРодитель.Тип = "ТаблицаКомпоновкиДанных"
		Или НовыйРодитель.Тип = "ДиаграммаКомпоновкиДанных" Тогда
		ПараметрыПеретаскивания.Действие = ДействиеПеретаскивания.Отмена;
		Возврат;
	КонецЕсли;
	
	// Проверка совместимости источника с приемником.
	ДопустимоТолькоНаличиеГруппировок = Ложь;
	Если НовыйРодитель.Тип = "КоллекцияЭлементовСтруктурыТаблицы"
		Или НовыйРодитель.Тип = "КоллекцияЭлементовСтруктурыДиаграммы"
		Или НовыйРодитель.Тип = "ГруппировкаТаблицы"
		Или НовыйРодитель.Тип = "ГруппировкаДиаграммы" Тогда
		ДопустимоТолькоНаличиеГруппировок = Истина;
	КонецЕсли;
	
	Если ДопустимоТолькоНаличиеГруппировок
		И Строка.Тип <> "Группировка"
		И Строка.Тип <> "ГруппировкаТаблицы"
		И Строка.Тип <> "ГруппировкаДиаграммы" Тогда
		ПараметрыПеретаскивания.Действие = ДействиеПеретаскивания.Отмена;
		Возврат;
	КонецЕсли;
	
	КоллекцииКоллекций = Новый Массив;
	КоллекцииКоллекций.Добавить(Строка.ПолучитьЭлементы());
	Количество = 1;
	Пока Количество > 0 Цикл
		Коллекция = КоллекцииКоллекций[0];
		Количество = Количество - 1;
		КоллекцииКоллекций.Удалить(0);
		Для Каждого ВложеннаяСтрока Из Коллекция Цикл
			Если ВложеннаяСтрока = НовыйРодитель Тогда
				ПараметрыПеретаскивания.Действие = ДействиеПеретаскивания.Отмена;
				Возврат;
			КонецЕсли;
			Если ДопустимоТолькоНаличиеГруппировок
				И ВложеннаяСтрока.Тип <> "Группировка"
				И ВложеннаяСтрока.Тип <> "ГруппировкаТаблицы"
				И ВложеннаяСтрока.Тип <> "ГруппировкаДиаграммы" Тогда
				ПараметрыПеретаскивания.Действие = ДействиеПеретаскивания.Отмена;
				Возврат;
			КонецЕсли;
			КоллекцииКоллекций.Добавить(ВложеннаяСтрока.ПолучитьЭлементы());
			Количество = Количество + 1;
		КонецЦикла;
	КонецЦикла;
КонецПроцедуры

&НаКлиенте
Процедура СтруктураВариантаПеретаскивание(Элемент, ПараметрыПеретаскивания, СтандартнаяОбработка, ИдентификаторЦели, Поле)
	// Все проверки пройдены.
	СтандартнаяОбработка = Ложь;
	
	Строка = СтруктураВарианта.НайтиПоИдентификатору(ПараметрыПеретаскивания.Значение);
	НовыйРодитель = СтруктураВарианта.НайтиПоИдентификатору(ИдентификаторЦели);
	
	Результат = ПереместитьЭлементыСтруктурыВарианта(Строка, НовыйРодитель);
	
	Элементы.СтруктураВарианта.Развернуть(НовыйРодитель.ПолучитьИдентификатор(), Истина);
	Элементы.СтруктураВарианта.ТекущаяСтрока = Результат.Строка.ПолучитьИдентификатор();
	
	УстановитьМодифицированность();
КонецПроцедуры

&НаКлиенте
Процедура СтруктураВариантаИспользованиеПриИзменении(Элемент)
	ИзменитьИспользованиеЭлементаНастройки("СтруктураВарианта");
КонецПроцедуры

&НаКлиенте
Процедура СтруктураВариантаЗаголовокПриИзменении(Элемент)
	Строка = Элементы.СтруктураВарианта.ТекущиеДанные;
	Если Строка = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	ОбновитьЗаголовокЭлементаСтруктурыВарианта(Строка);
	УстановитьМодифицированность();
КонецПроцедуры

&НаКлиенте
Процедура СтруктураВарианта_ПереместитьВверх(Команда)
	Контекст = НовыйКонтекст("СтруктураВарианта", "Переместить");
	Контекст.Вставить("Направление", -1);
	ОпределитьВыделенныеСтроки(Контекст);
	Если ЗначениеЗаполнено(Контекст.ПричинаОтказа) Тогда
		ПоказатьПредупреждение(, Контекст.ПричинаОтказа);
		Возврат;
	КонецЕсли;
	
	СдвинутьСтроки(Контекст);
КонецПроцедуры

&НаКлиенте
Процедура СтруктураВарианта_ПереместитьВниз(Команда)
	Контекст = НовыйКонтекст("СтруктураВарианта", "Переместить");
	Контекст.Вставить("Направление", 1);
	ОпределитьВыделенныеСтроки(Контекст);
	Если ЗначениеЗаполнено(Контекст.ПричинаОтказа) Тогда
		ПоказатьПредупреждение(, Контекст.ПричинаОтказа);
		Возврат;
	КонецЕсли;
	
	СдвинутьСтроки(Контекст);
КонецПроцедуры

&НаКлиенте
Процедура СтруктураВарианта_ПереместитьНаУровеньВыше(Команда)
	Контекст = НовыйКонтекст("СтруктураВарианта", "ПереместитьВИерархии");
	Контекст.Вставить("Направление", -1);
	ОпределитьВыделенныеСтроки(Контекст);
	
	Если ЗначениеЗаполнено(Контекст.ПричинаОтказа) Тогда
		ПоказатьПредупреждение(, Контекст.ПричинаОтказа);
		Возврат;
	КонецЕсли;
	
	ПереместитьВИерархии(Контекст);
КонецПроцедуры

&НаКлиенте
Процедура СтруктураВарианта_ПереместитьНаУровеньНиже(Команда)
	Контекст = НовыйКонтекст("СтруктураВарианта", "ПереместитьВИерархии");
	Контекст.Вставить("Направление", 1);
	ОпределитьВыделенныеСтроки(Контекст);
	
	Если ЗначениеЗаполнено(Контекст.ПричинаОтказа) Тогда
		ПоказатьПредупреждение(, Контекст.ПричинаОтказа);
		Возврат;
	КонецЕсли;
	
	ПереместитьВИерархии(Контекст);
КонецПроцедуры

&НаКлиенте
Процедура СтруктураВарианта_Изменить(Команда)
	ТаблицаЭлемент = Элементы.СтруктураВарианта;
	Поле = ТаблицаЭлемент.ТекущийЭлемент;
	СтандартнаяОбработка = Истина;
	СтрокаИдентификатор = ТаблицаЭлемент.ТекущаяСтрока;
	СтруктураВариантаВыбор(ТаблицаЭлемент, СтрокаИдентификатор, Поле, СтандартнаяОбработка);
КонецПроцедуры

&НаКлиенте
Процедура СтруктураВариантаПередУдалением(Элемент, Отказ)
	УдалитьСтроки(Элемент, Отказ);
КонецПроцедуры

&НаКлиенте
Процедура СтруктураВарианта_ПереместитьВышеИЛевее(Команда)
	Если Не Элементы.СтруктураВарианта_ПереместитьВышеИЛевее.Доступность Тогда
		Возврат;
	КонецЕсли;
	СтрокаТаблицыВверх = Элементы.СтруктураВарианта.ТекущиеДанные;
	Если СтрокаТаблицыВверх = Неопределено Тогда
		Возврат;
	КонецЕсли;
	СтрокаТаблицыВниз = СтрокаТаблицыВверх.ПолучитьРодителя();
	Если СтрокаТаблицыВниз = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	ПараметрыВыполнения = Новый Структура;
	ПараметрыВыполнения.Вставить("Режим",              "ВверхИВлево");
	ПараметрыВыполнения.Вставить("СтрокаТаблицыВверх", СтрокаТаблицыВверх);
	ПараметрыВыполнения.Вставить("СтрокаТаблицыВниз",  СтрокаТаблицыВниз);
	СтруктураВарианта_Переместить(-1, ПараметрыВыполнения);
КонецПроцедуры

&НаКлиенте
Процедура СтруктураВарианта_ПереместитьНижеИПравее(Команда)
	Если Не Элементы.СтруктураВарианта_ПереместитьНижеИПравее.Доступность Тогда
		Возврат;
	КонецЕсли;
	СтрокаТаблицыВниз = Элементы.СтруктураВарианта.ТекущиеДанные;
	Если СтрокаТаблицыВниз = Неопределено Тогда
		Возврат;
	КонецЕсли;
	ПараметрыВыполнения = Новый Структура;
	ПараметрыВыполнения.Вставить("Режим",              "ВнизИВправо");
	ПараметрыВыполнения.Вставить("СтрокаТаблицыВверх", Неопределено);
	ПараметрыВыполнения.Вставить("СтрокаТаблицыВниз",  СтрокаТаблицыВниз);
	
	ПодчиненныеСтроки = СтрокаТаблицыВниз.ПолучитьЭлементы();
	Количество = ПодчиненныеСтроки.Количество();
	Если Количество = 0 Тогда
		Возврат;
	ИначеЕсли Количество = 1 Тогда
		ПараметрыВыполнения.СтрокаТаблицыВверх = ПодчиненныеСтроки[0];
		СтруктураВарианта_Переместить(-1, ПараметрыВыполнения);
	Иначе
		Список = Новый СписокЗначений;
		Для НомерСтроки = 1 По Количество Цикл
			ПодчиненнаяСтрока = ПодчиненныеСтроки[НомерСтроки-1];
			Список.Добавить(ПодчиненнаяСтрока.ПолучитьИдентификатор(), ПодчиненнаяСтрока.Представление);
		КонецЦикла;
		Обработчик = Новый ОписаниеОповещения("СтруктураВарианта_Переместить", ЭтотОбъект, ПараметрыВыполнения);
		ПоказатьВыборИзМеню(Обработчик, Список);
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура СтруктураВарианта_Переместить(Результат, ПараметрыВыполнения) Экспорт
	Если Результат <> -1 Тогда
		Если ТипЗнч(Результат) <> Тип("ЭлементСпискаЗначений") Тогда
			Возврат;
		КонецЕсли;
		СтрокаТаблицыВверх = СтруктураВарианта.НайтиПоИдентификатору(Результат.Значение);
	Иначе
		СтрокаТаблицыВверх = ПараметрыВыполнения.СтрокаТаблицыВверх;
	КонецЕсли;
	СтрокаТаблицыВниз = ПараметрыВыполнения.СтрокаТаблицыВниз;
	
	// 0. Запомнить перед каким элементом вставлять верхнюю строку.
	СтрокиВниз = СтрокаТаблицыВниз.ПолучитьЭлементы();
	Индекс = СтрокиВниз.Индекс(СтрокаТаблицыВверх);
	МассивИдентификаторовСтрокВниз = Новый Массив;
	Для Каждого СтрокаТаблицы Из СтрокиВниз Цикл
		Если СтрокаТаблицы = СтрокаТаблицыВверх Тогда
			Продолжить;
		КонецЕсли;
		МассивИдентификаторовСтрокВниз.Добавить(СтрокаТаблицы.ПолучитьИдентификатор());
	КонецЦикла;
	
	// 1. Переместить нижнюю строку на уровень с верхней.
	Результат = ПереместитьЭлементыСтруктурыВарианта(СтрокаТаблицыВверх, СтрокаТаблицыВниз.ПолучитьРодителя(), СтрокаТаблицыВниз);
	СтрокаТаблицыВверх = Результат.Строка;
	
	// 2. Запомнить какие строки нужно переместить.
	СтрокиВверх = СтрокаТаблицыВверх.ПолучитьЭлементы();
	
	// 3. Обмен строками.
	Для Каждого СтрокаТаблицы Из СтрокиВверх Цикл
		ПереместитьЭлементыСтруктурыВарианта(СтрокаТаблицы, СтрокаТаблицыВниз);
	КонецЦикла;
	Для Каждого СтрокаТаблицыИдентификатор Из МассивИдентификаторовСтрокВниз Цикл
		СтрокаТаблицы = СтруктураВарианта.НайтиПоИдентификатору(СтрокаТаблицыИдентификатор);
		ПереместитьЭлементыСтруктурыВарианта(СтрокаТаблицы, СтрокаТаблицыВверх);
	КонецЦикла;
	
	// 4. Переместить верхнюю строку в нижнюю.
	СтрокиВверх = СтрокаТаблицыВверх.ПолучитьЭлементы();
	Если СтрокиВверх.Количество() - 1 < Индекс Тогда
		ПередЧемВставить = Неопределено;
	Иначе
		ПередЧемВставить = СтрокиВверх[Индекс];
	КонецЕсли;
	Результат = ПереместитьЭлементыСтруктурыВарианта(СтрокаТаблицыВниз, СтрокаТаблицыВверх, ПередЧемВставить);
	СтрокаТаблицыВниз = Результат.Строка;
	
	// Бантики.
	Если ПараметрыВыполнения.Режим = "ВнизИВправо" Тогда
		ТекущаяСтрока = СтрокаТаблицыВниз;
	Иначе
		ТекущаяСтрока = СтрокаТаблицыВверх;
	КонецЕсли;
	ТекущаяСтрокаИдентификатор = ТекущаяСтрока.ПолучитьИдентификатор();
	Элементы.СтруктураВарианта.Развернуть(ТекущаяСтрокаИдентификатор, Истина);
	Элементы.СтруктураВарианта.ТекущаяСтрока = ТекущаяСтрокаИдентификатор;
	
	ПользовательскиеНастройкиМодифицированы = Истина;
	Если РасширенныйРежим = 1 Тогда
		ВариантИзменен = Истина;
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура СтруктураВарианта_СохранитьВФайл(Команда)
	Адрес = АдресНастроекВСтрокеXML();
	ИмяФайла = НСтр("ru = 'Настройки.xml'");
	
	ПараметрыСохранения = ФайловаяСистемаКлиент.ПараметрыСохраненияФайла();
	ПараметрыСохранения.Диалог.Заголовок = НСтр("ru = 'Выберите файл для сохранения настроек отчета'");
	ПараметрыСохранения.Диалог.Фильтр    = НСтр("ru = 'Настройки отчета (*.xml)|*.xml'");
	
	ФайловаяСистемаКлиент.СохранитьФайл(Неопределено, Адрес, ИмяФайла, ПараметрыСохранения);
КонецПроцедуры

&НаСервере
Функция АдресНастроекВСтрокеXML()
	Возврат ПоместитьВоВременноеХранилище(
		ОбщегоНазначения.ЗначениеВСтрокуXML(Отчет.КомпоновщикНастроек.Настройки),
		УникальныйИдентификатор);
КонецФункции

#КонецОбласти

#Область ОбработчикиСобытийЭлементовТаблицыФормыСоставГруппировки

&НаКлиенте
Процедура СоставГруппировкиИспользованиеПриИзменении(Элемент)
	ИзменитьИспользованиеЭлементаНастройки("СоставГруппировки");
КонецПроцедуры

&НаКлиенте
Процедура СоставГруппировкиВыбор(Элемент, ИдентификаторСтроки, Поле, СтандартнаяОбработка)
	
	Строка = Элементы.СоставГруппировки.ТекущиеДанные;
	Если Строка = Неопределено Тогда
		СтандартнаяОбработка = Ложь;
		Возврат;
	КонецЕсли;
	
	Если Поле = Элементы.СоставГруппировкиПоле Тогда
		СтандартнаяОбработка = Ложь;
		Если ТипЗнч(Строка.Поле) = Тип("ПолеКомпоновкиДанных") Тогда 
			СоставГруппировкиВыбратьПоле(ИдентификаторСтроки, Строка);
		КонецЕсли;
	ИначеЕсли Поле <> Элементы.СоставГруппировкиТипГруппировки
		И Поле <> Элементы.СоставГруппировкиТипДополнения Тогда
		СтандартнаяОбработка = Ложь;
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура СоставГруппировкиПередНачаломДобавления(Элемент, Отказ, Копирование, Родитель, Группа, Параметр)
	Отказ = Истина;
	
	Если Копирование Тогда
		СкопироватьНастройки(Элемент);
		Возврат;
	КонецЕсли;
	
	ВыбратьПоле("СоставГруппировки", Новый ОписаниеОповещения("СоставГруппировкиПослеВыбораПоля", ЭтотОбъект));
КонецПроцедуры

&НаКлиенте
Процедура СоставГруппировкиПередУдалением(Элемент, Отказ)
	УдалитьСтроки(Элемент, Отказ);
КонецПроцедуры

&НаКлиенте
Процедура СоставГруппировкиТипГруппировкиПриИзменении(Элемент)
	Строка = Элементы.СоставГруппировки.ТекущиеДанные;
	Если Строка = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	СвойствоЭлементаСтруктуры = СвойствоЭлементаСтруктурыНастроек(
		Отчет.КомпоновщикНастроек, "ПоляГруппировки", ИдентификаторЭлементаСтруктурыНастроек);
	
	ЭлементНастройки = ЭлементНастройки(СвойствоЭлементаСтруктуры, Строка);
	ЭлементНастройки.ТипГруппировки = Строка.ТипГруппировки;
	
	УстановитьМодифицированность();
КонецПроцедуры

&НаКлиенте
Процедура СоставГруппировкиТипДополненияПриИзменении(Элемент)
	Строка = Элементы.СоставГруппировки.ТекущиеДанные;
	Если Строка = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	СвойствоЭлементаСтруктуры = СвойствоЭлементаСтруктурыНастроек(
		Отчет.КомпоновщикНастроек, "ПоляГруппировки", ИдентификаторЭлементаСтруктурыНастроек);
	
	ЭлементНастройки = ЭлементНастройки(СвойствоЭлементаСтруктуры, Строка);
	ЭлементНастройки.ТипДополнения = Строка.ТипДополнения;
	
	УстановитьМодифицированность();
КонецПроцедуры

&НаКлиенте
Процедура СоставГруппировки_ПереместитьВверх(Команда)
	СдвинутьПолеГруппировки();
КонецПроцедуры

&НаКлиенте
Процедура СоставГруппировки_ПереместитьВниз(Команда)
	СдвинутьПолеГруппировки(Ложь);
КонецПроцедуры

#КонецОбласти

#Область ОбработчикиСобытийЭлементовТаблицыФормыОформление

&НаКлиенте
Процедура ОформлениеПередНачаломДобавления(Элемент, Отказ, Копирование, Родитель, Группа, Параметр)
	Отказ = Истина;
	
	Если Копирование Тогда
		СкопироватьНастройки(Элемент);
		Возврат;
	КонецЕсли;
	
	ОформлениеИзменитьЭлемент();
КонецПроцедуры

&НаКлиенте
Процедура ОформлениеВыбор(Элемент, ИдентификаторСтроки, Поле, СтандартнаяОбработка)
	СтандартнаяОбработка = Ложь;
	
	Строка = Элементы.Оформление.ТекущиеДанные;
	Если Строка = Неопределено Или Строка.ЭтоРаздел Тогда 
		Возврат;
	КонецЕсли;
	
	Если Строка.ЭтоПараметрВывода Тогда 
		Если Строка(Строка.Идентификатор) = "TITLE"
			И Поле = Элементы.ОформлениеЗаголовок Тогда 
			
			Обработчик = Новый ОписаниеОповещения("ОформлениеВводЗаголовкаЗавершение", ЭтотОбъект, ИдентификаторСтроки);
			ПоказатьВводСтроки(Обработчик, Строка.Значение, НСтр("ru = 'Заголовок для печати'"),, Истина);
		КонецЕсли;
	ИначеЕсли Поле = Элементы.ОформлениеЗаголовок Тогда // Изменение порядка.
		ОформлениеИзменитьЭлемент(ИдентификаторСтроки, Строка);
	ИначеЕсли Поле = Элементы.ОформлениеИндексКартинкиДоступа Тогда // Изменение быстрого доступа к отбору.
		СвойствоЭлементаСтруктуры = СвойствоЭлементаСтруктурыНастроек(
			Отчет.КомпоновщикНастроек, "УсловноеОформление", ИдентификаторЭлементаСтруктурыНастроек);
		ВыбратьРежимОтображенияДляСтроки(СвойствоЭлементаСтруктуры, "Оформление", ИдентификаторСтроки, Истина, Ложь);
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура ОформлениеПередУдалением(Элемент, Отказ)
	УдалитьСтроки(Элемент, Отказ);
КонецПроцедуры

&НаКлиенте
Процедура ОформлениеИспользованиеПриИзменении(Элемент)
	ИзменитьИспользованиеЭлементаНастройки("Оформление");
КонецПроцедуры

&НаКлиенте
Процедура Оформление_ПереместитьВверх(Команда)
	СдвинутьОформление();
КонецПроцедуры

&НаКлиенте
Процедура Оформление_ПереместитьВниз(Команда)
	СдвинутьОформление(Ложь);
КонецПроцедуры

&НаКлиенте
Процедура Оформление_УстановитьФлажки(Команда)
	ИзменитьИспользованиеПредопределенныхПараметровВывода();
	ИзменитьИспользование("Оформление");
КонецПроцедуры

&НаКлиенте
Процедура Оформление_СнятьФлажки(Команда)
	ИзменитьИспользованиеПредопределенныхПараметровВывода(Ложь);
	ИзменитьИспользование("Оформление", Ложь);
КонецПроцедуры

&НаКлиенте
Процедура НастроитьКолонтитулы(Команда)
	Перем Настройки;
	
	Отчет.КомпоновщикНастроек.Настройки.ДополнительныеСвойства.Свойство("НастройкиКолонтитулов", Настройки);
	
	ОткрытьФорму("ОбщаяФорма.НастройкаКолонтитулов",
		Новый Структура("Настройки", Настройки),
		ЭтотОбъект,
		УникальныйИдентификатор,,,
		Новый ОписаниеОповещения("ЗапомнитьНастройкиКолонтитулов", ЭтотОбъект),
		РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);
КонецПроцедуры

#КонецОбласти

#Область ОбработчикиКомандФормы

&НаКлиенте
Процедура ЗакрытьИСформировать(Команда)
	ЗаписатьИЗакрыть(Истина);
КонецПроцедуры

&НаКлиенте
Процедура ЗакрытьБезФормирования(Команда)
	ЗаписатьИЗакрыть(Ложь);
КонецПроцедуры

&НаКлиенте
Процедура ИзменитьУсловияОтборов(Команда)
	ПараметрыФормы = Новый Структура;
	ПараметрыФормы.Вставить("ТипФормыВладельца", ТипФормыОтчета);
	ПараметрыФормы.Вставить("НастройкиОтчета", НастройкиОтчета);
	ПараметрыФормы.Вставить("КомпоновщикНастроек", Отчет.КомпоновщикНастроек);
	Обработчик = Новый ОписаниеОповещения("ИзменитьУсловияОтборовЗавершение", ЭтотОбъект);
	ОткрытьФорму("ХранилищеНастроек.ХранилищеВариантовОтчетов.Форма.УсловияОтборовОтчета", ПараметрыФормы, ЭтотОбъект, Истина,,, Обработчик);
КонецПроцедуры

&НаКлиенте
Процедура ИзменитьУсловияОтборовЗавершение(УсловияОтборов, Контекст) Экспорт
	Если УсловияОтборов = Неопределено
		Или УсловияОтборов = КодВозвратаДиалога.Отмена
		Или УсловияОтборов.Количество() = 0 Тогда
		Возврат;
	КонецЕсли;
	
	ПараметрыОбновления = Новый Структура;
	ПараметрыОбновления.Вставить("ИмяСобытия", "ИзменитьУсловияОтборов");
	ПараметрыОбновления.Вставить("КомпоновщикНастроекКД", Отчет.КомпоновщикНастроек);
	ПараметрыОбновления.Вставить("ПользовательскиеНастройкиМодифицированы", Истина);
	ПараметрыОбновления.Вставить("УсловияОтборов", УсловияОтборов);
	
	ОбновитьФорму(ПараметрыОбновления);
КонецПроцедуры

&НаКлиенте
Процедура ОчиститьНастройкиОтНесуществующихПолей(Команда)
	УдалитьПомеченныеНаУдалениеПоля();
	
	ПараметрыОбновления = Новый Структура;
	ПараметрыОбновления.Вставить("КомпоновщикНастроекКД", Отчет.КомпоновщикНастроек);
	
	ОбновитьФорму(ПараметрыОбновления);
КонецПроцедуры

&НаКлиенте
Процедура ПерейтиКНастройкамДляТехническогоСпециалиста(Команда)
	
	ОткрытьФормуНастроекДляТехническогоСпециалиста(Элементы.СтраницыНастроек.ТекущаяСтраница.Имя);
	
КонецПроцедуры

////////////////////////////////////////////////////////////////////////////////
// Подключаемые команды

&НаКлиенте
Процедура Подключаемый_ВыбратьПериод(Команда)
	ОтчетыКлиент.ВыбратьПериод(ЭтотОбъект, Команда.Имя);
КонецПроцедуры

&НаКлиенте
Процедура Подключаемый_СдвинутьПериодНазад(Команда)
	ОтчетыКлиент.СдвинутьПериод(ЭтотОбъект, Команда.Имя);
КонецПроцедуры

&НаКлиенте
Процедура Подключаемый_СдвинутьПериодВперед(Команда)
	ОтчетыКлиент.СдвинутьПериод(ЭтотОбъект, Команда.Имя);
КонецПроцедуры

&НаКлиенте
Процедура Подключаемый_Список_Подбор(Команда)
	ПутьКСписку = СтрЗаменить(Команда.Имя, "Подбор", "");
	
	ПараметрыЗаполнения = ПараметрыЗаполненияСписка();
	ПараметрыЗаполнения.ПутьКСписку = ПутьКСписку;
	ПараметрыЗаполнения.Индекс = ПутьКДаннымЭлементов.ПоИмени[ПутьКСписку];
	ПараметрыЗаполнения.Владелец = Элементы[ПутьКСписку];
	ПараметрыЗаполнения.Вставить("ЭтоПодбор", Истина);
	
	НачатьЗаполнениеСписка(Элементы[Команда.Имя], ПараметрыЗаполнения);
КонецПроцедуры

&НаКлиенте
Процедура Подключаемый_Список_ВставитьИзБуфера(Команда)
	ПутьКСписку = СтрЗаменить(Команда.Имя, "ВставитьИзБуфера", "");
	
	Список = ЭтотОбъект[ПутьКСписку];
	ПолеСписка = Элементы[ПутьКСписку]; // ТаблицаФормы
	
	Индекс = ПутьКДаннымЭлементов.ПоИмени[ПутьКСписку];
	Сведения = ОтчетыКлиент.СведенияОЭлементеНастройки(Отчет.КомпоновщикНастроек, Индекс);
	ПользовательскиеНастройки = Отчет.КомпоновщикНастроек.ПользовательскиеНастройки.Элементы;
	
	ПараметрыВыбора = ОтчетыКлиентСервер.ПараметрыВыбора(Сведения.Настройки, ПользовательскиеНастройки, Сведения.Элемент);
	Список.ТипЗначения = ОтчетыКлиент.ТипЗначенияОграниченныйСвязьюПоТипу(
		Сведения.Настройки, ПользовательскиеНастройки, Сведения.Элемент, Сведения.Описание);
	
	ПараметрыПоиска = Новый Структура;
	ПараметрыПоиска.Вставить("ОписаниеТипов", ОписаниеТиповБезПримитивных(Список.ТипЗначения));
	ПараметрыПоиска.Вставить("ПредставлениеПоля", ПолеСписка.Заголовок);
	ПараметрыПоиска.Вставить("Сценарий", "ВставкаИзБуфераОбмена");
	ПараметрыПоиска.Вставить("ПараметрыВыбора", ПараметрыВыбора);
	
	Обработчик = Новый ОписаниеОповещения("ВставитьИзБуфераЗавершение", ЭтотОбъект, ПутьКСписку);
	
	МодульЗагрузкаДанныхИзФайлаКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("ЗагрузкаДанныхИзФайлаКлиент");
	МодульЗагрузкаДанныхИзФайлаКлиент.ПоказатьФормуЗаполненияСсылок(ПараметрыПоиска, Обработчик);
КонецПроцедуры

#КонецОбласти

#Область СлужебныеПроцедурыИФункции

// Параметры:
//  Описание - см. ВариантыОтчетов.НастройкиФормыОтчета
//
// Возвращаемое значение:
//   см. ВариантыОтчетов.НастройкиФормыОтчета
//
&НаКлиентеНаСервереБезКонтекста
Функция ОписаниеНастроекОтчета(Описание)
	
	Возврат Описание;
	
КонецФункции

#Область ПоляГруппировки

// Чтение настроек.

&НаСервере
Процедура ОбновитьПоляГруппировки()
	СвойствоЭлементаСтруктуры = СвойствоЭлементаСтруктурыНастроек(
		Отчет.КомпоновщикНастроек, "ПоляГруппировки", ИдентификаторЭлементаСтруктурыНастроек);
	
	Если СвойствоЭлементаСтруктуры = Неопределено Тогда 
		Возврат;
	КонецЕсли;
	
	Для Каждого ЭлементНастройки Из СвойствоЭлементаСтруктуры.Элементы Цикл 
		Строка = СоставГруппировки.ПолучитьЭлементы().Добавить();
		ЗаполнитьЗначенияСвойств(Строка, ЭлементНастройки);
		Строка.Идентификатор = СвойствоЭлементаСтруктуры.ПолучитьИдентификаторПоОбъекту(ЭлементНастройки);
		
		Если ТипЗнч(ЭлементНастройки) = Тип("АвтоПолеГруппировкиКомпоновкиДанных") Тогда 
			Строка.Заголовок  = НСтр("ru = 'Авто (по всем полям)'");
			Строка.Картинка = ОтчетыКлиентСервер.ИндексКартинки("Элемент", "Предопределенный");
			Продолжить;
		КонецЕсли;
		
		ОписаниеНастройки = СвойствоЭлементаСтруктуры.ДоступныеПоляПолейГруппировок.НайтиПоле(ЭлементНастройки.Поле);
		Если ОписаниеНастройки = Неопределено Тогда 
			УстановитьПометкуУдаления("СоставГруппировки", Строка);
			Продолжить;
		КонецЕсли;
		
		ЗаполнитьЗначенияСвойств(Строка, ОписаниеНастройки);
		Строка.ПоказыватьТипДополнения = ОписаниеНастройки.ТипЗначения.СодержитТип(Тип("Дата"));
		
		Если ОписаниеНастройки.Ресурс Тогда
			Строка.Картинка = ОтчетыКлиентСервер.ИндексКартинки("Ресурс");
		ИначеЕсли ОписаниеНастройки.Таблица Тогда
			Строка.Картинка = ОтчетыКлиентСервер.ИндексКартинки("Таблица");
		ИначеЕсли ОписаниеНастройки.Папка Тогда
			Строка.Картинка = ОтчетыКлиентСервер.ИндексКартинки("Группа");
		Иначе
			Строка.Картинка = ОтчетыКлиентСервер.ИндексКартинки("Элемент");
		КонецЕсли;
	КонецЦикла;
КонецПроцедуры

// Добавление, изменение элементов.

&НаКлиенте
Процедура СоставГруппировкиВыбратьПоле(ИдентификаторСтроки, Строка)
	СвойствоЭлементаСтруктуры = СвойствоЭлементаСтруктурыНастроек(
		Отчет.КомпоновщикНастроек, "ПоляГруппировки", ИдентификаторЭлементаСтруктурыНастроек);
	ЭлементНастройки = ЭлементНастройки(СвойствоЭлементаСтруктуры, Строка);
	
	Обработчик = Новый ОписаниеОповещения("СоставГруппировкиПослеВыбораПоля", ЭтотОбъект, ИдентификаторСтроки);
	ВыбратьПоле("СоставГруппировки", Обработчик, ЭлементНастройки.Поле);
КонецПроцедуры

&НаКлиенте
Процедура СоставГруппировкиПослеВыбораПоля(ОписаниеНастройки, ИдентификаторСтроки) Экспорт
	Если ОписаниеНастройки = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	Настройки = Отчет.КомпоновщикНастроек.Настройки;
	ВариантыОтчетовСлужебныйКлиент.ДобавитьФормулу(Настройки, Настройки.ДоступныеПоляГруппировок, ОписаниеНастройки);
	
	СвойствоЭлементаСтруктуры = СвойствоЭлементаСтруктурыНастроек(
		Отчет.КомпоновщикНастроек, "ПоляГруппировки", ИдентификаторЭлементаСтруктурыНастроек);
	
	Если ИдентификаторСтроки = Неопределено Тогда 
		Строка = СоставГруппировки.ПолучитьЭлементы().Добавить();
		ЭлементНастройки = СвойствоЭлементаСтруктуры.Элементы.Добавить(Тип("ПолеГруппировкиКомпоновкиДанных"));
	Иначе
		Строка = СоставГруппировки.НайтиПоИдентификатору(ИдентификаторСтроки);
		ЭлементНастройки = ЭлементНастройки(СвойствоЭлементаСтруктуры, Строка);
	КонецЕсли;
	
	ЭлементНастройки.Использование = Истина;
	ЭлементНастройки.Поле = ОписаниеНастройки.Поле;
	
	ЗаполнитьЗначенияСвойств(Строка, ЭлементНастройки);
	Строка.Идентификатор = СвойствоЭлементаСтруктуры.ПолучитьИдентификаторПоОбъекту(ЭлементНастройки);
	
	ЗаполнитьЗначенияСвойств(Строка, ОписаниеНастройки);
	
	Строка.ПоказыватьТипДополнения = ОписаниеНастройки.ТипЗначения.СодержитТип(Тип("Дата"));
	
	Если ОписаниеНастройки.Ресурс Тогда
		Строка.Картинка = ОтчетыКлиентСервер.ИндексКартинки("Ресурс");
	ИначеЕсли ОписаниеНастройки.Таблица Тогда
		Строка.Картинка = ОтчетыКлиентСервер.ИндексКартинки("Таблица");
	ИначеЕсли ОписаниеНастройки.Папка Тогда
		Строка.Картинка = ОтчетыКлиентСервер.ИндексКартинки("Группа");
	Иначе
		Строка.Картинка = ОтчетыКлиентСервер.ИндексКартинки("Элемент");
	КонецЕсли;
	
	ИзменитьИспользованиеСвязанныхЭлементовНастроек("СоставГруппировки", Строка, ЭлементНастройки);
	
	Элементы.СоставГруппировки.ТекущаяСтрока = Строка.ПолучитьИдентификатор();
	
	УстановитьМодифицированность();
КонецПроцедуры

// Сдвиг элементов.

&НаКлиенте
Процедура СдвинутьПолеГруппировки(ВНачало = Истина)
	ИдентификаторыСтрок = Элементы.СоставГруппировки.ВыделенныеСтроки;
	Если ИдентификаторыСтрок.Количество() = 0 Тогда 
		Возврат;
	КонецЕсли;
	
	СвойствоЭлементаСтруктуры = СвойствоЭлементаСтруктурыНастроек(
		Отчет.КомпоновщикНастроек, "ПоляГруппировки", ИдентификаторЭлементаСтруктурыНастроек);
	
	Для Каждого ИдентификаторСтроки Из ИдентификаторыСтрок Цикл 
		Строка = СоставГруппировки.НайтиПоИдентификатору(ИдентификаторСтроки);
		ЭлементНастройки = ЭлементНастройки(СвойствоЭлементаСтруктуры, Строка);
		
		ЭлементыНастроек = СвойствоЭлементаСтруктуры.Элементы;
		Строки = СоставГруппировки.ПолучитьЭлементы();
		
		Индекс = ЭлементыНастроек.Индекс(ЭлементНастройки);
		Граница = ЭлементыНастроек.Количество() - 1;
		
		Если ВНачало Тогда // Сдвиг в начало коллекции.
			Если Индекс = 0 Тогда 
				ЭлементыНастроек.Сдвинуть(ЭлементНастройки, Граница);
				Строки.Сдвинуть(Индекс, Граница);
			Иначе
				ЭлементыНастроек.Сдвинуть(ЭлементНастройки, -1);
				Строки.Сдвинуть(Индекс, -1);
			КонецЕсли;
		Иначе // Сдвиг в конец коллекции.
			Если Индекс = Граница Тогда 
				ЭлементыНастроек.Сдвинуть(ЭлементНастройки, -Граница);
				Строки.Сдвинуть(Индекс, -Граница);
			Иначе
				ЭлементыНастроек.Сдвинуть(ЭлементНастройки, 1);
				Строки.Сдвинуть(Индекс, 1);
			КонецЕсли;
		КонецЕсли;
	КонецЦикла;
	
	УстановитьМодифицированность();
КонецПроцедуры

#КонецОбласти

#Область ПараметрыДанныхИОтборы

// Чтение настроек.

&НаСервере
Процедура ОбновитьПараметрыДанных()
	Если РасширенныйРежим = 0
		Или РежимИзмененияЭлементаСтруктурыНастроек Тогда 
		Возврат;
	КонецЕсли;
	
	СвойствоЭлементаСтруктуры = СвойствоЭлементаСтруктурыНастроек(
		Отчет.КомпоновщикНастроек, "ПараметрыДанных", ИдентификаторЭлементаСтруктурыНастроек);
	
	Раздел = Отборы.ПолучитьЭлементы().Добавить();
	Раздел.ЭтоРаздел = Истина;
	Раздел.Заголовок = НСтр("ru = 'Параметры'");
	Раздел.Картинка = ОтчетыКлиентСервер.ИндексКартинки("ПараметрыДанных");
	Раздел.Идентификатор = "ПараметрыДанных";
	ЭлементыРаздела = Раздел.ПолучитьЭлементы();
	
	Если СвойствоЭлементаСтруктуры = Неопределено
		Или СвойствоЭлементаСтруктуры.Элементы.Количество() = 0 Тогда 
		Возврат;
	КонецЕсли;
	
	Схема = ПолучитьИзВременногоХранилища(НастройкиОтчета.АдресСхемы); // СхемаКомпоновкиДанных
	
	Для Каждого ЭлементНастройки Из СвойствоЭлементаСтруктуры.Элементы Цикл 
		НайденныйПараметр = Схема.Параметры.Найти(ЭлементНастройки.Параметр);
		Если НайденныйПараметр <> Неопределено И НайденныйПараметр.ОграничениеИспользования Тогда 
			Продолжить;
		КонецЕсли;
		
		Строка = ЭлементыРаздела.Добавить();
		ЗаполнитьЗначенияСвойств(Строка, ЭлементНастройки);
		Строка.Идентификатор = СвойствоЭлементаСтруктуры.ПолучитьИдентификаторПоОбъекту(ЭлементНастройки);
		Строка.КартинкаРежимаОтображения = КартинкаРежимаОтображенияЭлементаНастройки(ЭлементНастройки);
		Строка.Картинка = -1;
		Строка.ЭтоПараметр = Истина;
		Строка.ЭтоПериод = (ТипЗнч(Строка.Значение) = Тип("СтандартныйПериод"));
		
		ОписаниеНастройки = СвойствоЭлементаСтруктуры.ДоступныеПараметры.НайтиПараметр(ЭлементНастройки.Параметр);
		Если ОписаниеНастройки <> Неопределено Тогда 
			ЗаполнитьЗначенияСвойств(Строка, ОписаниеНастройки,, "Использование");
			Строка.ОтображатьИспользование = (ОписаниеНастройки.Использование <> ИспользованиеПараметраКомпоновкиДанных.Всегда);
			
			Если ОписаниеНастройки.ДоступныеЗначения <> Неопределено Тогда 
				ЭлементСписка = ОписаниеНастройки.ДоступныеЗначения.НайтиПоЗначению(ЭлементНастройки.Значение);
				Если ЭлементСписка <> Неопределено Тогда 
					Строка.ПредставлениеЗначения = ЭлементСписка.Представление;
				КонецЕсли;
			КонецЕсли;
		КонецЕсли;
		
		Если Не ЗначениеЗаполнено(Строка.ПредставлениеПользовательскойНастройки) Тогда 
			Строка.ПредставлениеПользовательскойНастройки = Строка.Заголовок;
		КонецЕсли;
		Строка.ЭтоПредопределенныйЗаголовок = (Строка.Заголовок = Строка.ПредставлениеПользовательскойНастройки);
	КонецЦикла;
КонецПроцедуры

&НаСервере
Процедура ОбновитьОтборы(Строки = Неопределено, ЭлементыНастроек = Неопределено)
	Если РасширенныйРежим = 0 Тогда 
		Возврат;
	КонецЕсли;
	
	СвойствоЭлементаСтруктуры = СвойствоЭлементаСтруктурыНастроек(
		Отчет.КомпоновщикНастроек, "Отбор", ИдентификаторЭлементаСтруктурыНастроек);
	
	Если СвойствоЭлементаСтруктуры = Неопределено Тогда 
		Возврат;
	КонецЕсли;
	
	Если Строки = Неопределено Тогда 
		Раздел = Отборы.ПолучитьЭлементы().Добавить();
		Раздел.ЭтоРаздел = Истина;
		Раздел.Заголовок = НСтр("ru = 'Отборы'");
		Раздел.Картинка = ОтчетыКлиентСервер.ИндексКартинки("Отборы");
		Раздел.Идентификатор = "Отборы";
		Строки = Раздел.ПолучитьЭлементы();
	КонецЕсли;
	
	Если ЭлементыНастроек = Неопределено Тогда 
		ЭлементыНастроек = СвойствоЭлементаСтруктуры.Элементы;
	КонецЕсли;
	
	Для Каждого ЭлементНастройки Из ЭлементыНастроек Цикл 
		Строка = Строки.Добавить();
		
		Если Не УстановитьДанныеСтрокиОтборов(Строка, СвойствоЭлементаСтруктуры, ЭлементНастройки) Тогда 
			УстановитьПометкуУдаления("Отборы", Строка);
		КонецЕсли;
		
		Если ТипЗнч(ЭлементНастройки) = Тип("ГруппаЭлементовОтбораКомпоновкиДанных") Тогда 
			ОбновитьОтборы(Строка.ПолучитьЭлементы(), ЭлементНастройки.Элементы);
		КонецЕсли;
	КонецЦикла;
КонецПроцедуры

&НаКлиентеНаСервереБезКонтекста
Функция УстановитьДанныеСтрокиОтборов(Строка, СвойствоЭлементаСтруктуры, ЭлементНастройки, ОписаниеНастройки = Неопределено)
	УстановленыУспешно = Истина;
	
	ЭтоГруппа = (ТипЗнч(ЭлементНастройки) = Тип("ГруппаЭлементовОтбораКомпоновкиДанных"));
	
	Если ОписаниеНастройки = Неопределено Тогда 
		Если Не ЭтоГруппа Тогда 
			ОписаниеНастройки = СвойствоЭлементаСтруктуры.ДоступныеПоляОтбора.НайтиПоле(ЭлементНастройки.ЛевоеЗначение);
			УстановленыУспешно = (ОписаниеНастройки <> Неопределено);
		КонецЕсли;
		
		Если ОписаниеНастройки = Неопределено Тогда 
			ОписаниеНастройки = Новый Структура("ДоступныеЗначения, ДоступныеВидыСравнения");
			ОписаниеНастройки.Вставить("ТипЗначения", Новый ОписаниеТипов("Неопределено"));
		КонецЕсли;
	КонецЕсли;
	
	ДоступныеВидыСравнения = ОписаниеНастройки.ДоступныеВидыСравнения;
	Если ДоступныеВидыСравнения <> Неопределено
		И ДоступныеВидыСравнения.Количество() > 0
		И ДоступныеВидыСравнения.НайтиПоЗначению(ЭлементНастройки.ВидСравнения) = Неопределено Тогда 
		ЭлементНастройки.ВидСравнения = ДоступныеВидыСравнения[0].Значение;
	КонецЕсли;
	
	ЗаполнитьЗначенияСвойств(Строка, ОписаниеНастройки);
	ЗаполнитьЗначенияСвойств(Строка, ЭлементНастройки);
	
	Строка.Идентификатор = СвойствоЭлементаСтруктуры.ПолучитьИдентификаторПоОбъекту(ЭлементНастройки);
	Строка.Поле = Строка.Заголовок;
	Строка.ОтображатьИспользование = Истина;
	Строка.ЭтоПериод = (ТипЗнч(Строка.ПравоеЗначение) = Тип("СтандартныйПериод"));
	Строка.ЭтоУникальныйИдентификатор = (ТипЗнч(Строка.ПравоеЗначение) = Тип("УникальныйИдентификатор")); 

	Если Строка.ТипЗначения = Новый ОписаниеТипов("Дата") И Не ОтчетыКлиентСервер.ЭтоВидСравненияСписка(ЭлементНастройки.ВидСравнения) Тогда
		Строка.ТипЗначения = Новый ОписаниеТипов("СтандартнаяДатаНачала");
	КонецЕсли;

	Строка.ЭтоГруппа = ЭтоГруппа;
	Строка.КартинкаРежимаОтображения = КартинкаРежимаОтображенияЭлементаНастройки(ЭлементНастройки);
	Строка.Картинка = -1;
	
	Если ЭтоГруппа Тогда 
		Строка.Заголовок = Строка.ТипГруппы;
	Иначе
		ОтчетыКлиентСервер.ПривестиЗначениеКТипу(ЭлементНастройки.ПравоеЗначение, ОписаниеНастройки.ТипЗначения);
	КонецЕсли;
	
	Если Не ЗначениеЗаполнено(Строка.ПредставлениеПользовательскойНастройки) Тогда 
		Если ЗначениеЗаполнено(ЭлементНастройки.Представление) Тогда 
			Строка.ПредставлениеПользовательскойНастройки = ЭлементНастройки.Представление;
		Иначе
			Строка.ПредставлениеПользовательскойНастройки = Строка.Заголовок;
		КонецЕсли;
	КонецЕсли;
	Строка.ЭтоПредопределенныйЗаголовок = (Строка.Заголовок = Строка.ПредставлениеПользовательскойНастройки);
	
	ПривестиЗначениеКВидуСравнения(Строка, ЭлементНастройки);
	УстановитьПредставлениеЗначения(Строка);
	
	Возврат УстановленыУспешно;
КонецФункции

// Добавление, изменение элементов.

&НаКлиенте
Процедура ОтборыВыбратьГруппу(ИдентификаторСтроки)
	Обработчик = Новый ОписаниеОповещения("ОтборыПослеВыбораГруппы", ЭтотОбъект, ИдентификаторСтроки);
	
	Список = Новый СписокЗначений;
	Список.Добавить(ТипГруппыЭлементовОтбораКомпоновкиДанных.ГруппаИ);
	Список.Добавить(ТипГруппыЭлементовОтбораКомпоновкиДанных.ГруппаИли);
	Список.Добавить(ТипГруппыЭлементовОтбораКомпоновкиДанных.ГруппаНе);
	
	ПоказатьВыборИзМеню(Обработчик, Список);
КонецПроцедуры

&НаКлиенте
Процедура ОтборыПослеВыбораГруппы(ТипГруппы, ИдентификаторСтроки) Экспорт
	Если ТипГруппы = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	Строка = Отборы.НайтиПоИдентификатору(ИдентификаторСтроки);
	Если Строка = Неопределено Тогда
		Возврат;
	КонецЕсли;
	Если Не Строка.ЭтоГруппа Тогда
		ПоказатьПредупреждение(, НСтр("ru = 'Выберите группу.'"));
		Возврат;
	КонецЕсли;

	Строка.ТипГруппы = ?(ТипЗнч(ТипГруппы) = Тип("ТипГруппыЭлементовОтбораКомпоновкиДанных"), ТипГруппы, ТипГруппы.Значение);
	Строка.Заголовок = Строка.ТипГруппы;
	Строка.ПредставлениеПользовательскойНастройки = Строка.ТипГруппы;
	
	СвойствоЭлементаСтруктуры = СвойствоЭлементаСтруктурыНастроек(
		Отчет.КомпоновщикНастроек, "Отбор", ИдентификаторЭлементаСтруктурыНастроек);
	
	ЭлементНастройки = ЭлементНастройки(СвойствоЭлементаСтруктуры, Строка);
	ЭлементНастройки.ТипГруппы = Строка.ТипГруппы;
	
	УстановитьМодифицированность();
КонецПроцедуры

&НаКлиенте
Процедура ОтборыПередВыборомПоля(ИдентификаторСтроки = Неопределено)
	Если Не РежимИзмененияЭлементаСтруктурыНастроек Тогда
		Строка = Элементы.Отборы.ТекущиеДанные;
		
		Если (Строка = Неопределено)
			Или (Строка.ЭтоПараметр)
			Или (Строка.ЭтоРаздел И Строка.Идентификатор = "ПараметрыДанных") Тогда
			
			Строка = Отборы.ПолучитьЭлементы()[1];
			Элементы.Отборы.ТекущаяСтрока = Строка.ПолучитьИдентификатор();
		КонецЕсли;
	КонецЕсли;
	
	Обработчик = Новый ОписаниеОповещения("ОтборыПослеВыбораПоля", ЭтотОбъект, ИдентификаторСтроки);
	ВыбратьПоле("Отборы", Обработчик);
КонецПроцедуры

&НаКлиенте
Процедура ОтборыПослеВыбораПоля(ОписаниеНастройки, ИдентификаторСтроки) Экспорт
	Если ОписаниеНастройки = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	Настройки = Отчет.КомпоновщикНастроек.Настройки;
	ВариантыОтчетовСлужебныйКлиент.ДобавитьФормулу(Настройки, Настройки.ДоступныеПоляОтбора, ОписаниеНастройки);
	
	СвойствоЭлементаСтруктуры = СвойствоЭлементаСтруктурыНастроек(
		Отчет.КомпоновщикНастроек, "Отбор", ИдентификаторЭлементаСтруктурыНастроек);
	
	Если ИдентификаторСтроки = Неопределено Тогда 
		Родитель = Элементы.Отборы.ТекущиеДанные; // см. ЭлементКоллекцииФормыНастроек
		Если Родитель = Неопределено Тогда
			Родитель = КорневаяСтрокаПоУмолчанию("Отборы"); // см. ЭлементКоллекцииФормыНастроек
		КонецЕсли;
		Если Не Родитель.ЭтоРаздел И Не Родитель.ЭтоГруппа Тогда 
			Родитель = Родитель.ПолучитьРодителя();
		КонецЕсли;
		Строка = Родитель.ПолучитьЭлементы().Добавить();
		
		РодительЭлементаНастройки = СвойствоЭлементаСтруктуры;
		Если ТипЗнч(Родитель.Идентификатор) = Тип("ИдентификаторКомпоновкиДанных") Тогда 
			РодительЭлементаНастройки = СвойствоЭлементаСтруктуры.ПолучитьОбъектПоИдентификатору(Родитель.Идентификатор);
		КонецЕсли;
		ЭлементНастройки = РодительЭлементаНастройки.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	Иначе
		Строка = Отборы.НайтиПоИдентификатору(ИдентификаторСтроки);
		ЭлементНастройки = ЭлементНастройки(СвойствоЭлементаСтруктуры, Строка);
	КонецЕсли;
	
	ЭлементНастройки.Использование = Истина;
	ЭлементНастройки.ЛевоеЗначение = ОписаниеНастройки.Поле;
	ЭлементНастройки.ПравоеЗначение = ОписаниеНастройки.Тип.ПривестиЗначение();
	ЭлементНастройки.РежимОтображения = РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Обычный;
	ЭлементНастройки.ИдентификаторПользовательскойНастройки = Новый УникальныйИдентификатор;
	ЭлементНастройки.ПредставлениеПользовательскойНастройки = "";
	
	ДоступныеВидыСравнения = ОписаниеНастройки.ДоступныеВидыСравнения;
	Если ДоступныеВидыСравнения <> Неопределено
		И ДоступныеВидыСравнения.Количество() > 0
		И ДоступныеВидыСравнения.НайтиПоЗначению(ЭлементНастройки.ВидСравнения) = Неопределено Тогда 
		ЭлементНастройки.ВидСравнения = ДоступныеВидыСравнения[0].Значение;
	КонецЕсли;
	
	УстановитьДанныеСтрокиОтборов(Строка, СвойствоЭлементаСтруктуры, ЭлементНастройки, ОписаниеНастройки);
	
	Раздел = КорневаяСтрокаПоУмолчанию("Отборы");
	Элементы.Отборы.Развернуть(Раздел.ПолучитьИдентификатор(), Истина);
	
	УстановитьМодифицированность();
КонецПроцедуры

&НаКлиенте
Процедура УстановитьПараметрыРедактированияЭлементаОтбора()
	
	Строка = Элементы.Отборы.ТекущиеДанные;
	
	Если Строка = Неопределено
		Или Строка.ЭтоРаздел
		Или Строка.ЭтоГруппа Тогда
		
		Возврат;
	КонецЕсли;
	
	#Область ПараметрыРедактированияУсловия
	
	ПолеУсловия = Элементы.ОтборыВидСравнения;
	ПолеУсловия.РежимВыбораИзСписка = (Строка.ДоступныеВидыСравнения <> Неопределено);
	
	Если Строка.ДоступныеВидыСравнения <> Неопределено Тогда 
		
		Список = ПолеУсловия.СписокВыбора;
		Список.Очистить();
		
		Для Каждого ВидыСравнения Из Строка.ДоступныеВидыСравнения Цикл 
			ЗаполнитьЗначенияСвойств(Список.Добавить(), ВидыСравнения);
		КонецЦикла;
		
	КонецЕсли;
	
	Если Строка.ЭтоПараметр Тогда 
		
		Условие = ВидСравненияКомпоновкиДанных.Равно;
		Если Строка.ДоступенСписокЗначений Тогда 
			Условие = ВидСравненияКомпоновкиДанных.ВСписке;
		КонецЕсли;
		
	Иначе
		Условие = Строка.ВидСравнения;
	КонецЕсли;
	
	#КонецОбласти
	
	#Область ПараметрыРедактированияЗначения
	
	ПолеЗначения = ?(Строка.ЭтоПараметр, Элементы.ОтборыЗначение, Элементы.ОтборыПравоеЗначение);
	ПолеЗначения.ДоступныеТипы = Строка.ТипЗначения;
	ПолеЗначения.ВыборГруппИЭлементов = ОтчетыКлиентСервер.ЗначениеТипаГруппыИЭлементы(Строка.ВыборГруппИЭлементов, Условие);
	
	Список = ПолеЗначения.СписокВыбора;
	Список.Очистить();
	
	Если Строка.ДоступныеЗначения <> Неопределено Тогда 
		
		Для Каждого ДоступноеЗначение Из Строка.ДоступныеЗначения Цикл 
			ЗаполнитьЗначенияСвойств(Список.Добавить(), ДоступноеЗначение);
		КонецЦикла;
		
	КонецЕсли;
	
	#КонецОбласти
	
КонецПроцедуры

&НаКлиенте
Процедура ОтборыПриИзмененииТекущейСтроки()
	Строка = Элементы.Отборы.ТекущиеДанные;
	
	Если Строка = Неопределено Тогда
		УстановитьДоступностьКомандОтборов();
	Иначе
		УстановитьДоступностьКомандОтборов(Не Строка.ЭтоПараметр И Не Строка.ЭтоРаздел, Строка.ЭтоРаздел);
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура УстановитьДоступностьКомандОтборов(ЭтоОтбор = Ложь, ЭтоРаздел = Ложь)
	Элементы.Отборы_Удалить.Доступность = ЭтоОтбор;
	Элементы.Отборы_Удалить1.Доступность = ЭтоОтбор;
	Элементы.Отборы_Сгруппировать.Доступность = ЭтоОтбор;
	Элементы.Отборы_Сгруппировать1.Доступность = ЭтоОтбор;
	Элементы.Отборы_Разгруппировать.Доступность = ЭтоОтбор;
	Элементы.Отборы_Разгруппировать1.Доступность = ЭтоОтбор;
	Элементы.Отборы_ПереместитьВверх.Доступность = ЭтоОтбор;
	Элементы.Отборы_ПереместитьВверх1.Доступность = ЭтоОтбор;
	Элементы.Отборы_ПереместитьВниз.Доступность = ЭтоОтбор;
	Элементы.Отборы_ПереместитьВниз1.Доступность = ЭтоОтбор;
	
	Элементы.КомандыОтборов_Показывать.Доступность = Не ЭтоРаздел;
	Элементы.КомандыОтборов_Показывать1.Доступность = Не ЭтоРаздел;
	Элементы.Отборы_ПоказыватьТолькоФлажокВШапкеОтчета.Доступность = ЭтоОтбор;
	Элементы.Отборы_ПоказыватьТолькоФлажокВШапкеОтчета1.Доступность = ЭтоОтбор;
	Элементы.Отборы_ПоказыватьТолькоФлажокВНастройкахОтчета.Доступность = ЭтоОтбор;
	Элементы.Отборы_ПоказыватьТолькоФлажокВНастройкахОтчета1.Доступность = ЭтоОтбор;
КонецПроцедуры

&НаКлиенте
Процедура ОтборыУстановитьРежимОтображения(РежимОтображения)
	
	ИдентификаторСтрок = Элементы.Отборы.ВыделенныеСтроки;
	Если ИдентификаторСтрок.Количество() = 0 Тогда 
		Возврат;
	КонецЕсли;
	
	СвойстваЭлементовНастроек = Новый Массив;
	КоличествоПараметров = 0;
	
	Для Каждого ИдентификаторСтроки Из ИдентификаторСтрок Цикл 
		
		Строка = Отборы.НайтиПоИдентификатору(ИдентификаторСтроки);
		
		Если Строка.ЭтоРаздел Тогда 
			Продолжить;
		КонецЕсли;
		
		Если Строка.ЭтоПараметр Тогда 
			СвойствоЭлементаСтруктуры = СвойствоЭлементаСтруктурыНастроек(Отчет.КомпоновщикНастроек, "ПараметрыДанных");
			КоличествоПараметров = КоличествоПараметров + 1;
		Иначе
			СвойствоЭлементаСтруктуры = СвойствоЭлементаСтруктурыНастроек(
				Отчет.КомпоновщикНастроек, "Отбор", ИдентификаторЭлементаСтруктурыНастроек);
		КонецЕсли;
		
		ЭлементНастроек = СвойствоЭлементаСтруктуры.ПолучитьОбъектПоИдентификатору(Строка.Идентификатор);
		
		СвойстваЭлементаНастроек = Новый Структура;
		СвойстваЭлементаНастроек.Вставить("ИдентификаторСтроки", ИдентификаторСтроки);
		СвойстваЭлементаНастроек.Вставить("ИдентификаторЭлементаНастроек", Строка.Идентификатор);
		СвойстваЭлементаНастроек.Вставить("ЭлементНастроек", ЭлементНастроек);
		
		СвойстваЭлементовНастроек.Добавить(СвойстваЭлементаНастроек);
		
	КонецЦикла;
	
	ПоказыватьРежимыФлажков = (КоличествоПараметров = СвойстваЭлементовНастроек.Количество());
	ВыбратьРежимОтображенияДляСтрок(СвойстваЭлементовНастроек, "Отборы", ПоказыватьРежимыФлажков, РежимОтображения);
	
КонецПроцедуры

&НаКлиенте
Процедура Список_ПриНачалеИзменения()
	
	ПутьКСписку = Список_ПередНачаломИзменения.Имя;
	ЭлементСписка = Элементы[Список_ПередНачаломИзменения.Имя + "Значение"];
	
	ПараметрыЗаполнения = ПараметрыЗаполненияСписка(Истина, Ложь, Ложь);
	ПараметрыЗаполнения.ПутьКСписку = ПутьКСписку;
	ПараметрыЗаполнения.Индекс = ПутьКДаннымЭлементов.ПоИмени[ПутьКСписку];
	
	ВыборПереопределен = Ложь;
	НачатьЗаполнениеСписка(ЭлементСписка, ПараметрыЗаполнения, ВыборПереопределен);
	
	Если ВыборПереопределен Тогда
		Список_ПередНачаломИзменения.ЗакончитьРедактированиеСтроки(Ложь);
		Возврат;
	КонецЕсли;
	
	ЭлементСписка.РедактированиеТекста = Истина;
	
КонецПроцедуры

// Изменение группировки элементов.

// Возвращаемое значение:
//  Структура:
//    * Строки - Массив из ДанныеФормыЭлементДерева:
//    * Родитель - ДанныеФормыЭлементДерева:
//        ** Идентификатор - ИдентификаторКомпоновкиДанных
//    * Индекс - Число
//   Неопределено
//
&НаКлиенте
Функция ПараметрыГруппировкиОтборов()
	Строки = Новый Массив;
	Родители = Новый Массив;
	
	ИдентификаторыСтрок = Элементы.Отборы.ВыделенныеСтроки;
	Для Каждого ИдентификаторСтроки Из ИдентификаторыСтрок Цикл 
		Строка = Отборы.НайтиПоИдентификатору(ИдентификаторСтроки);
		Родитель = Строка.ПолучитьРодителя();
		
		Если Родитель = Неопределено Или Родитель.ПолучитьЭлементы().Индекс(Строка) < 0
			Или ТипЗнч(Строка.Идентификатор) <> Тип("ИдентификаторКомпоновкиДанных") Тогда 
			Продолжить;
		КонецЕсли;
		
		Строки.Добавить(Строка);
		Родители.Добавить(Родитель);
	КонецЦикла;
	
	Если Строки.Количество() = 0 Тогда 
		ПоказатьПредупреждение(, НСтр("ru = 'Выберите элементы.'"));
		Возврат Неопределено;
	КонецЕсли;
	
	Родители = ОбщегоНазначенияКлиентСервер.СвернутьМассив(Родители);
	Если Родители.Количество() > 1 Тогда 
		ПоказатьПредупреждение(, НСтр("ru = 'Выбранные элементы не могут быть сгруппированы, поскольку они принадлежат разным родителям.'"));
		Возврат Неопределено;
	КонецЕсли;
	
	Строки = МассивСортировать(Строки);
	Родитель = Родители[0];
	ДочерниеЭлементы = Родитель.ПолучитьЭлементы(); // ДанныеФормыКоллекцияЭлементовДерева 
	
	Индекс = ДочерниеЭлементы.Индекс(Строки[0]);
	
	Возврат Новый Структура("Строки, Родитель, Индекс", Строки, Родитель, Индекс);
КонецФункции

&НаКлиенте
Процедура ИзменитьГруппировкуОтборов(ОтборыУзлаНастроек, Строки, НаследникиЭлементовНастроек, НаследникиСтрок)
	Для Каждого СтрокаИсточник Из Строки Цикл 
		ЭлементНастройкиИсточник = ОтборыУзлаНастроек.ПолучитьОбъектПоИдентификатору(СтрокаИсточник.Идентификатор);
		
		Если ЭлементНастройкиИсточник.Родитель = Неопределено Тогда 
			РодительЭлементаНастройкиИсточника = ОтборыУзлаНастроек;
		Иначе
			РодительЭлементаНастройкиИсточника = ЭлементНастройкиИсточник.Родитель;
		КонецЕсли;
		РодительЭлементаНастройкиПриемника = НаследникиЭлементовНастроек.Получить(РодительЭлементаНастройкиИсточника); // ГруппаЭлементовОтбораКомпоновкиДанных
		
		РодительСтрокиИсточника = СтрокаИсточник.ПолучитьРодителя();
		РодительСтрокиПриемника = НаследникиСтрок.Получить(РодительСтрокиИсточника);
		
		Индекс = РодительЭлементаНастройкиПриемника.Элементы.Индекс(РодительЭлементаНастройкиИсточника);
		Если Индекс < 0 Тогда 
			ЭлементНастройкиПриемник = РодительЭлементаНастройкиПриемника.Элементы.Добавить(ТипЗнч(ЭлементНастройкиИсточник));
			СтрокаПриемник = РодительСтрокиПриемника.ПолучитьЭлементы().Добавить();
		Иначе // Это удаление группировки.
			ЭлементНастройкиПриемник = РодительЭлементаНастройкиПриемника.Элементы.Вставить(Индекс, ТипЗнч(ЭлементНастройкиИсточник));
			СтрокаПриемник = РодительСтрокиПриемника.ПолучитьЭлементы().Вставить(Индекс);
		КонецЕсли;
		
		ЗаполнитьЗначенияСвойств(ЭлементНастройкиПриемник, ЭлементНастройкиИсточник);
		ЗаполнитьЗначенияСвойств(СтрокаПриемник, СтрокаИсточник);
		СтрокаПриемник.Идентификатор = ОтборыУзлаНастроек.ПолучитьИдентификаторПоОбъекту(ЭлементНастройкиПриемник);
		
		НаследникиЭлементовНастроек.Вставить(ЭлементНастройкиИсточник, ЭлементНастройкиПриемник);
		НаследникиСтрок.Вставить(СтрокаИсточник, СтрокаПриемник);
		
		ИзменитьГруппировкуОтборов(ОтборыУзлаНастроек, СтрокаИсточник.ПолучитьЭлементы(), НаследникиЭлементовНастроек, НаследникиСтрок);
	КонецЦикла;
КонецПроцедуры

&НаКлиенте
Процедура УдалитьБазовыеЭлементыГруппировкиОтборов(ОтборыУзлаНастроек, ПараметрыГруппировки)
	Родитель = ПараметрыГруппировки.Родитель; // см. ЭлементКоллекцииФормыНастроек
	Строки = Родитель.ПолучитьЭлементы();
	
	ЭлементыНастроек = ОтборыУзлаНастроек.Элементы;
	Если ТипЗнч(Родитель.Идентификатор) = Тип("ИдентификаторКомпоновкиДанных") Тогда 
		ЭлементыНастроек = ОтборыУзлаНастроек.ПолучитьОбъектПоИдентификатору(Родитель.Идентификатор).Элементы;
	КонецЕсли;
	
	Индекс = ПараметрыГруппировки.Строки.ВГраница();
	Пока Индекс >= 0 Цикл 
		Строка = ПараметрыГруппировки.Строки[Индекс]; // см. ЭлементКоллекцииФормыНастроек
		ЭлементНастройки = ОтборыУзлаНастроек.ПолучитьОбъектПоИдентификатору(Строка.Идентификатор);
		
		Строки.Удалить(Строка);
		ЭлементыНастроек.Удалить(ЭлементНастройки);
		
		Индекс = Индекс - 1;
	КонецЦикла;
КонецПроцедуры

// Перетаскивание элементов.

&НаКлиенте
Процедура ПроверитьПеретаскиваемыеСтрокиИзОтборов(ИдентификаторыСтрок)
	Родители = Новый Массив;
	
	Индекс = ИдентификаторыСтрок.ВГраница();
	Пока Индекс >= 0 Цикл 
		ИдентификаторСтроки = ИдентификаторыСтрок[Индекс];
		
		Строка = Отборы.НайтиПоИдентификатору(ИдентификаторСтроки);
		Родитель = Строка.ПолучитьРодителя();
		
		Если Родитель = Неопределено
			Или Родитель.ПолучитьЭлементы().Индекс(Строка) < 0
			Или ТипЗнч(Строка.Идентификатор) <> Тип("ИдентификаторКомпоновкиДанных")
			Или Родитель.Идентификатор = "ПараметрыДанных" Тогда 
			ИдентификаторыСтрок.Удалить(Индекс);
		Иначе
			Родители.Добавить(Родитель);
		КонецЕсли;
		
		Индекс = Индекс - 1;
	КонецЦикла;
	
	Родители = ОбщегоНазначенияКлиентСервер.СвернутьМассив(Родители);
	Если Родители.Количество() > 1 Тогда 
		ИдентификаторыСтрок.Очистить();
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура ПеретащитьОтборыВПределахКоллекции(ПараметрыПеретаскивания, ТекущаяСтрока) 
	
	ТекущиеДанные = Отборы.НайтиПоИдентификатору(ТекущаяСтрока);
	
	Строки = Новый Массив;
	Для Каждого ИдентификаторСтроки Из ПараметрыПеретаскивания.Значение Цикл 
		Строки.Добавить(Отборы.НайтиПоИдентификатору(ИдентификаторСтроки));
	КонецЦикла;
	
	СтрокаИсточник = Строки[0].ПолучитьРодителя(); // см. ЭлементКоллекцииФормыНастроек
	Если ТекущиеДанные.ЭтоРаздел Или ТекущиеДанные.ЭтоГруппа Тогда 
		СтрокаПриемник = ТекущиеДанные;
	Иначе
		СтрокаПриемник = ТекущиеДанные.ПолучитьРодителя();
	КонецЕсли; 
	
	Индекс = СтрокаПриемник.ПолучитьЭлементы().Индекс(ТекущиеДанные);
	Если Индекс < 0 Тогда 
		Индекс = 0;
	КонецЕсли;
	
	НаследникиСтрок = Новый Соответствие;
	НаследникиСтрок.Вставить(СтрокаИсточник, СтрокаПриемник);
	
	СвойствоЭлементаСтруктуры = СвойствоЭлементаСтруктурыНастроек(
		Отчет.КомпоновщикНастроек, "Отбор", ИдентификаторЭлементаСтруктурыНастроек, РасширенныйРежим);
	
	ЭлементНастройкиИсточник = СвойствоЭлементаСтруктуры;
	Если ТипЗнч(СтрокаИсточник.Идентификатор) = Тип("ИдентификаторКомпоновкиДанных") Тогда 
		ЭлементНастройкиИсточник = СвойствоЭлементаСтруктуры.ПолучитьОбъектПоИдентификатору(СтрокаИсточник.Идентификатор);
	КонецЕсли;
	
	ЭлементНастройкиПриемник = СвойствоЭлементаСтруктуры;
	Если ТипЗнч(СтрокаПриемник.Идентификатор) = Тип("ИдентификаторКомпоновкиДанных") Тогда 
		ЭлементНастройкиПриемник = СвойствоЭлементаСтруктуры.ПолучитьОбъектПоИдентификатору(СтрокаПриемник.Идентификатор);
	КонецЕсли;
	
	НаследникиЭлементовНастроек = Новый Соответствие;
	НаследникиЭлементовНастроек.Вставить(ЭлементНастройкиИсточник, ЭлементНастройкиПриемник);
	
	ПеретащитьОтборы(СвойствоЭлементаСтруктуры, Индекс, Строки, НаследникиЭлементовНастроек, НаследникиСтрок);
	
	Раздел = КорневаяСтрокаПоУмолчанию("Отборы");
	Элементы.Отборы.Развернуть(Раздел.ПолучитьИдентификатор(), Истина);
	
	УстановитьМодифицированность();
КонецПроцедуры

&НаКлиенте
Процедура ПеретащитьОтборы(ВыбранныеПоляУзлаНастроек, Индекс, Строки, НаследникиЭлементовНастроек, НаследникиСтрок)
	Для Каждого СтрокаИсточник Из Строки Цикл
		ЭлементНастройкиИсточник = ВыбранныеПоляУзлаНастроек.ПолучитьОбъектПоИдентификатору(СтрокаИсточник.Идентификатор);
		
		РодительЭлементаНастройкиИсточник = ВыбранныеПоляУзлаНастроек;
		Если ЭлементНастройкиИсточник.Родитель <> Неопределено Тогда 
			РодительЭлементаНастройкиИсточник = ЭлементНастройкиИсточник.Родитель;
		КонецЕсли;
		
		РодительЭлементаНастройкиПриемник = НаследникиЭлементовНастроек.Получить(РодительЭлементаНастройкиИсточник); // ГруппаЭлементовОтбораКомпоновкиДанных
		РодительСтрокиПриемник = НаследникиСтрок.Получить(СтрокаИсточник.ПолучитьРодителя()); // см. ЭлементКоллекцииФормыНастроек
		
		Если Индекс > РодительЭлементаНастройкиПриемник.Элементы.Количество() - 1 Тогда 
			ЭлементНастройкиПриемник = РодительЭлементаНастройкиПриемник.Элементы.Добавить(ТипЗнч(ЭлементНастройкиИсточник));
			СтрокаПриемник = РодительСтрокиПриемник.ПолучитьЭлементы().Добавить();
		Иначе
			ЭлементНастройкиПриемник = РодительЭлементаНастройкиПриемник.Элементы.Вставить(Индекс, ТипЗнч(ЭлементНастройкиИсточник));
			СтрокаПриемник = РодительСтрокиПриемник.ПолучитьЭлементы().Вставить(Индекс);
		КонецЕсли;
		
		ЗаполнитьЗначенияСвойств(ЭлементНастройкиПриемник, ЭлементНастройкиИсточник);
		ЗаполнитьЗначенияСвойств(СтрокаПриемник, СтрокаИсточник);
		СтрокаПриемник.Идентификатор = ВыбранныеПоляУзлаНастроек.ПолучитьИдентификаторПоОбъекту(ЭлементНастройкиПриемник);
		СтрокаПриемник.ЭтоГруппа = (ТипЗнч(ЭлементНастройкиПриемник) = Тип("ГруппаЭлементовОтбораКомпоновкиДанных"));
		
		НаследникиЭлементовНастроек.Вставить(ЭлементНастройкиИсточник, ЭлементНастройкиПриемник);
		НаследникиСтрок.Вставить(СтрокаИсточник, СтрокаПриемник);
		
		Если ТипЗнч(ЭлементНастройкиПриемник) = Тип("ГруппаЭлементовОтбораКомпоновкиДанных") Тогда 
			ПеретащитьОтборы(ВыбранныеПоляУзлаНастроек, Индекс, СтрокаИсточник.ПолучитьЭлементы(), НаследникиЭлементовНастроек, НаследникиСтрок)
		КонецЕсли;
	КонецЦикла;
КонецПроцедуры

// Сдвиг элементов.

&НаКлиенте
Процедура СдвинутьОтборы(ВНачало = Истина)
	ПараметрыСдвига = ПараметрыСдвигаОтборов();
	Если ПараметрыСдвига = Неопределено Тогда 
		Возврат;
	КонецЕсли;
	
	СвойствоЭлементаСтруктуры = СвойствоЭлементаСтруктурыНастроек(
		Отчет.КомпоновщикНастроек, "Отбор", ИдентификаторЭлементаСтруктурыНастроек);
	
	Для Каждого Строка Из ПараметрыСдвига.Строки Цикл 
		ЭлементНастройки = ЭлементНастройки(СвойствоЭлементаСтруктуры, Строка);
		ЭлементыНастроек = СвойствоЭлементаСтруктуры.Элементы;
		
		Если ЭлементНастройки.Родитель <> Неопределено Тогда
			ЭлементыНастроек = ЭлементНастройки.Родитель.Элементы;
		КонецЕсли;
		Строки = ПараметрыСдвига.Родитель.ПолучитьЭлементы();
		
		Индекс = ЭлементыНастроек.Индекс(ЭлементНастройки);
		Граница = ЭлементыНастроек.Количество() - 1;
		
		Если ВНачало Тогда // Сдвиг в начало коллекции.
			Если Индекс = 0 Тогда 
				ЭлементыНастроек.Сдвинуть(ЭлементНастройки, Граница);
				Строки.Сдвинуть(Индекс, Граница);
			Иначе
				ЭлементыНастроек.Сдвинуть(ЭлементНастройки, -1);
				Строки.Сдвинуть(Индекс, -1);
			КонецЕсли;
		Иначе // Сдвиг в конец коллекции.
			Если Индекс = Граница Тогда 
				ЭлементыНастроек.Сдвинуть(ЭлементНастройки, -Граница);
				Строки.Сдвинуть(Индекс, -Граница);
			Иначе
				ЭлементыНастроек.Сдвинуть(ЭлементНастройки, 1);
				Строки.Сдвинуть(Индекс, 1);
			КонецЕсли;
		КонецЕсли;
	КонецЦикла;
	
	УстановитьМодифицированность();
КонецПроцедуры

&НаКлиенте
Функция ПараметрыСдвигаОтборов()
	Строки = Новый Массив;
	Родители = Новый Массив;
	
	ИдентификаторыСтрок = Элементы.Отборы.ВыделенныеСтроки;
	Для Каждого ИдентификаторСтроки Из ИдентификаторыСтрок Цикл 
		Строка = Отборы.НайтиПоИдентификатору(ИдентификаторСтроки);
		Родитель = Строка.ПолучитьРодителя();
		
		Если Родитель = Неопределено Или Родитель.ПолучитьЭлементы().Индекс(Строка) < 0
			Или ТипЗнч(Строка.Идентификатор) <> Тип("ИдентификаторКомпоновкиДанных") Тогда 
			Продолжить;
		КонецЕсли;
		
		Строки.Добавить(Строка);
		Родители.Добавить(Родитель);
	КонецЦикла;
	
	Если Строки.Количество() = 0 Тогда 
		ПоказатьПредупреждение(, НСтр("ru = 'Выберите элементы.'"));
		Возврат Неопределено;
	КонецЕсли;
	
	Родители = ОбщегоНазначенияКлиентСервер.СвернутьМассив(Родители);
	Если Родители.Количество() > 1 Тогда 
		ПоказатьПредупреждение(, НСтр("ru = 'Выбранные элементы не могут быть перемещены, поскольку они принадлежат разным родителям.'"));
		Возврат Неопределено;
	КонецЕсли;
	
	Возврат Новый Структура("Строки, Родитель", МассивСортировать(Строки), Родители[0]);
КонецФункции

#КонецОбласти

#Область ВыбранныеПоля

// Чтение настроек.

&НаСервере
Процедура ОбновитьВыбранныеПоля(Строки = Неопределено, ЭлементыНастроек = Неопределено)
	СвойствоЭлементаСтруктуры = СвойствоЭлементаСтруктурыНастроек(
		Отчет.КомпоновщикНастроек, "Выбор", ИдентификаторЭлементаСтруктурыНастроек, РасширенныйРежим);
	
	Если СвойствоЭлементаСтруктуры = Неопределено Тогда 
		Возврат;
	КонецЕсли;
	
	Если Строки = Неопределено Тогда 
		Раздел = ВыбранныеПоля.ПолучитьЭлементы().Добавить();
		Раздел.ЭтоРаздел = Истина;
		Раздел.Заголовок = НСтр("ru = 'Поля'");
		Раздел.Картинка = ВариантыОтчетовСлужебныйКлиентСервер.ИндексКартинкиПоля(Неопределено);
		Раздел.Идентификатор = "ВыбранныеПоля";
		Строки = Раздел.ПолучитьЭлементы();
	КонецЕсли;
	
	Если ЭлементыНастроек = Неопределено Тогда 
		ЭлементыНастроек = СвойствоЭлементаСтруктуры.Элементы;
	КонецЕсли;
	
	Для Каждого ЭлементНастройки Из ЭлементыНастроек Цикл 
		Строка = Строки.Добавить();
		ЗаполнитьЗначенияСвойств(Строка, ЭлементНастройки);
		Строка.Идентификатор = СвойствоЭлементаСтруктуры.ПолучитьИдентификаторПоОбъекту(ЭлементНастройки);
		
		Если ТипЗнч(ЭлементНастройки) = Тип("АвтоВыбранноеПолеКомпоновкиДанных") Тогда 
			Строка.Заголовок = НСтр("ru = 'Авто (поля родителя)'");
			Строка.Картинка = 18;
			Продолжить;
		КонецЕсли;
		
		Если ТипЗнч(ЭлементНастройки) = Тип("ГруппаВыбранныхПолейКомпоновкиДанных") Тогда 
			Строка.ЭтоГруппа = Истина;
			Строка.Картинка = ВариантыОтчетовСлужебныйКлиентСервер.ИндексКартинкиПоля(Неопределено, Истина);
			Строка.Заголовок = ЗаголовокГруппыВыбранныхПолей(ЭлементНастройки);
			
			ОбновитьВыбранныеПоля(Строка.ПолучитьЭлементы(), ЭлементНастройки.Элементы);
		Иначе
			ОписаниеНастройки = СвойствоЭлементаСтруктуры.ДоступныеПоляВыбора.НайтиПоле(ЭлементНастройки.Поле);
			Если ОписаниеНастройки = Неопределено Тогда 
				УстановитьПометкуУдаления("ВыбранныеПоля", Строка);
			Иначе
				ЗаполнитьЗначенияСвойств(Строка, ОписаниеНастройки);
				Строка.Картинка = ВариантыОтчетовСлужебныйКлиентСервер.ИндексКартинкиПоля(ОписаниеНастройки.ТипЗначения);
				
				УстановитьИндикаторФормулы(Отчет.КомпоновщикНастроек.Настройки, ОписаниеНастройки, Строка);
			КонецЕсли;
		КонецЕсли;
	КонецЦикла;
КонецПроцедуры

// Добавление, изменение элементов.

&НаКлиенте
Процедура ВыбранныеПоляВыбратьГруппу(ИдентификаторСтроки, Строка)
	СвойствоЭлементаСтруктуры = СвойствоЭлементаСтруктурыНастроек(
		Отчет.КомпоновщикНастроек, "Выбор", ИдентификаторЭлементаСтруктурыНастроек, РасширенныйРежим);
	
	ЭлементНастройки = ЭлементНастройки(СвойствоЭлементаСтруктуры, Строка);
	
	ПараметрыФормы = Новый Структура;
	ПараметрыФормы.Вставить("ЗаголовокГруппы", ЭлементНастройки.Заголовок);
	ПараметрыФормы.Вставить("Расположение", ЭлементНастройки.Расположение);
	
	Обработчик = Новый ОписаниеОповещения("ВыбранныеПоляПослеВыбораГруппы", ЭтотОбъект, ИдентификаторСтроки);
	
	ОткрытьФорму("ХранилищеНастроек.ХранилищеВариантовОтчетов.Форма.ГруппаВыбранныхПолей",
		ПараметрыФормы, ЭтотОбъект, УникальныйИдентификатор,,, Обработчик, РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);
КонецПроцедуры

// Параметры:
//  СвойстваГруппы - Структура:
//    * ЗаголовокГруппы - Строка
//    * Расположение - РасположениеПоляКомпоновкиДанных
//  ИдентификаторСтроки - Число
//
&НаКлиенте
Процедура ВыбранныеПоляПослеВыбораГруппы(СвойстваГруппы, ИдентификаторСтроки) Экспорт
	Если ТипЗнч(СвойстваГруппы) <> Тип("Структура") Тогда
		Возврат;
	КонецЕсли;
	
	Строка = ВыбранныеПоля.НайтиПоИдентификатору(ИдентификаторСтроки);
	
	СвойствоЭлементаСтруктуры = СвойствоЭлементаСтруктурыНастроек(
		Отчет.КомпоновщикНастроек, "Выбор", ИдентификаторЭлементаСтруктурыНастроек, РасширенныйРежим);
	
	ЭлементНастройки = ЭлементНастройки(СвойствоЭлементаСтруктуры, Строка);
	ЭлементНастройки.Заголовок = СвойстваГруппы.ЗаголовокГруппы;
	ЭлементНастройки.Расположение = СвойстваГруппы.Расположение;
	
	ЗаполнитьЗначенияСвойств(Строка, ЭлементНастройки);
	
	Если ЭлементНастройки.Расположение <> РасположениеПоляКомпоновкиДанных.Авто Тогда 
		Строка.Заголовок = Строка.Заголовок + " (" + Строка(ЭлементНастройки.Расположение) + ")";
	КонецЕсли;

	УстановитьМодифицированность();
КонецПроцедуры

&НаКлиенте
Процедура ВыбранныеПоляВыбратьПоле(ИдентификаторСтроки, Строка)
	СвойствоЭлементаСтруктуры = СвойствоЭлементаСтруктурыНастроек(
		Отчет.КомпоновщикНастроек, "Выбор", ИдентификаторЭлементаСтруктурыНастроек, РасширенныйРежим);
	
	ЭлементНастройки = ЭлементНастройки(СвойствоЭлементаСтруктуры, Строка);
	
	Обработчик = Новый ОписаниеОповещения("ВыбранныеПоляПослеВыбораПоля", ЭтотОбъект, ИдентификаторСтроки);
	ВыбратьПоле("ВыбранныеПоля", Обработчик, ЭлементНастройки.Поле);
КонецПроцедуры

&НаКлиенте
Процедура ВыбранныеПоляПослеВыбораПоля(ОписаниеНастройки, ИдентификаторСтроки = Неопределено) Экспорт
	Если ОписаниеНастройки = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	Настройки = Отчет.КомпоновщикНастроек.Настройки;
	ВариантыОтчетовСлужебныйКлиент.ДобавитьФормулу(Настройки, Настройки.ДоступныеПоляВыбора, ОписаниеНастройки);
	
	СвойствоЭлементаСтруктуры = СвойствоЭлементаСтруктурыНастроек(
		Отчет.КомпоновщикНастроек, "Выбор", ИдентификаторЭлементаСтруктурыНастроек, РасширенныйРежим);
	
	Если ИдентификаторСтроки = Неопределено Тогда 
		Родитель = Элементы.ВыбранныеПоля.ТекущиеДанные; // см. ЭлементКоллекцииФормыНастроек
		Если Родитель = Неопределено Тогда 
			Родитель = КорневаяСтрокаПоУмолчанию("ВыбранныеПоля"); // см. ЭлементКоллекцииФормыНастроек
		КонецЕсли;
		
		Если Не Родитель.ЭтоРаздел И Не Родитель.ЭтоГруппа Тогда 
			Родитель = Родитель.ПолучитьРодителя(); // см. ЭлементКоллекцииФормыНастроек
		КонецЕсли;
		Строка = Родитель.ПолучитьЭлементы().Добавить();
		
		РодительЭлементаНастройки = СвойствоЭлементаСтруктуры;
		Если ТипЗнч(Родитель.Идентификатор) = Тип("ИдентификаторКомпоновкиДанных") Тогда 
			РодительЭлементаНастройки = СвойствоЭлементаСтруктуры.ПолучитьОбъектПоИдентификатору(Родитель.Идентификатор);
		КонецЕсли;
		ЭлементНастройки = РодительЭлементаНастройки.Элементы.Добавить(Тип("ВыбранноеПолеКомпоновкиДанных"));
	Иначе
		Строка = ВыбранныеПоля.НайтиПоИдентификатору(ИдентификаторСтроки);
		ЭлементНастройки = ЭлементНастройки(СвойствоЭлементаСтруктуры, Строка);
	КонецЕсли;
	
	ЭлементНастройки.Использование = Истина;
	ЭлементНастройки.Поле = ОписаниеНастройки.Поле;
	
	ЗаполнитьЗначенияСвойств(Строка, ЭлементНастройки);
	ЗаполнитьЗначенияСвойств(Строка, ОписаниеНастройки);
	
	Строка.Идентификатор = СвойствоЭлементаСтруктуры.ПолучитьИдентификаторПоОбъекту(ЭлементНастройки);
	Строка.Картинка = ВариантыОтчетовСлужебныйКлиентСервер.ИндексКартинкиПоля(ОписаниеНастройки.ТипЗначения);
	
	УстановитьИндикаторФормулы(Настройки, ОписаниеНастройки, Строка);
	
	УстановитьМодифицированность();
КонецПроцедуры

&НаКлиентеНаСервереБезКонтекста
Процедура УстановитьИндикаторФормулы(Настройки, ОписаниеНастройки, Строка)
	Формула = ВариантыОтчетовСлужебныйКлиентСервер.ФормулаПоПутиКДанным(Настройки, Строка(ОписаниеНастройки.Поле));
	Строка.ЭтоФормула = (Формула <> Неопределено);
	
	Если Строка.ЭтоФормула Тогда 
		Строка.ИндикаторФормулы = БиблиотекаКартинок.ТипФункция;
	Иначе
		Строка.ИндикаторФормулы = БиблиотекаКартинок.Пустая;
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура ПослеАктивизацииВыбранныхПолей()
	Строка = Элементы.ВыбранныеПоля.ТекущиеДанные;
	
	Элементы.ВыбранныеПоляИзменитьФормулу.Доступность = Строка <> Неопределено
		И Строка.ЭтоФормула;
КонецПроцедуры

&НаКлиенте
Процедура ВыбранныеПоляПередНачаломДобавления(Элемент, Отказ, Копирование, Родитель, Группа, Параметр)
	Отказ = Истина;
	
	Если Копирование Тогда
		СкопироватьНастройки(Элемент);
		Возврат;
	КонецЕсли;
	
	Обработчик = Новый ОписаниеОповещения("ВыбранныеПоляПослеВыбораПоля", ЭтотОбъект);
	ВыбратьПоле("ВыбранныеПоля", Обработчик);
КонецПроцедуры

// Изменение группировки элементов.

// Возвращаемое значение:
//  - Структура:
//      * Строки - Массив из ДанныеФормыЭлементДерева
//      * Родитель - см. ЭлементКоллекцииФормыНастроек
//      * Индекс - Число
//  - Неопределено
//
&НаКлиенте
Функция ПараметрыГруппировкиВыбранныхПолей()
	Строки = Новый Массив;
	Родители = Новый Массив;
	
	ИдентификаторыСтрок = Элементы.ВыбранныеПоля.ВыделенныеСтроки;
	Для Каждого ИдентификаторСтроки Из ИдентификаторыСтрок Цикл 
		Строка = ВыбранныеПоля.НайтиПоИдентификатору(ИдентификаторСтроки);
		Родитель = Строка.ПолучитьРодителя();
		
		Если Родитель = Неопределено Или Родитель.ПолучитьЭлементы().Индекс(Строка) < 0
			Или ТипЗнч(Строка.Идентификатор) <> Тип("ИдентификаторКомпоновкиДанных") Тогда 
			Продолжить;
		КонецЕсли;
		
		Строки.Добавить(Строка);
		Родители.Добавить(Родитель);
	КонецЦикла;
	
	Если Строки.Количество() = 0 Тогда 
		ПоказатьПредупреждение(, НСтр("ru = 'Выберите элементы.'"));
		Возврат Неопределено;
	КонецЕсли;
	
	Родители = ОбщегоНазначенияКлиентСервер.СвернутьМассив(Родители);
	Если Родители.Количество() > 1 Тогда 
		ПоказатьПредупреждение(, НСтр("ru = 'Выбранные элементы не могут быть сгруппированы, поскольку они принадлежат разным родителям.'"));
		Возврат Неопределено;
	КонецЕсли;
	
	Строки = МассивСортировать(Строки);
	Родитель = Родители[0]; // ДанныеФормыЭлементДерева
	Индекс = Родитель.ПолучитьЭлементы().Индекс(Строки[0]);
	
	Возврат Новый Структура("Строки, Родитель, Индекс", Строки, Родитель, Индекс);
КонецФункции

// Параметры:
//  СвойстваГруппы - Структура:
//    * ЗаголовокГруппы - Строка
//    * Расположение - РасположениеПоляКомпоновкиДанных
//  ПараметрыГруппировки - см. ПараметрыГруппировкиВыбранныхПолей
//
&НаКлиенте
Процедура ВыбранныеПоляПередГруппировкойПолей(СвойстваГруппы, ПараметрыГруппировки) Экспорт
	Если ТипЗнч(СвойстваГруппы) <> Тип("Структура") Тогда
		Возврат;
	КонецЕсли;
	
	СвойствоЭлементаСтруктуры = СвойствоЭлементаСтруктурыНастроек(
		Отчет.КомпоновщикНастроек, "Выбор", ИдентификаторЭлементаСтруктурыНастроек, РасширенныйРежим);
	
	// Обработка элементов настроек.
	ЭлементНастройкиИсточник = СвойствоЭлементаСтруктуры;
	Если ТипЗнч(ПараметрыГруппировки.Родитель.Идентификатор) = Тип("ИдентификаторКомпоновкиДанных") Тогда 
		ЭлементНастройкиИсточник = СвойствоЭлементаСтруктуры.ПолучитьОбъектПоИдентификатору(ПараметрыГруппировки.Родитель.Идентификатор);
	КонецЕсли;
	
	ЭлементНастройкиПриемник = ЭлементНастройкиИсточник.Элементы.Вставить(ПараметрыГруппировки.Индекс, Тип("ГруппаВыбранныхПолейКомпоновкиДанных"));
	ЭлементНастройкиПриемник.Заголовок = СвойстваГруппы.ЗаголовокГруппы;
	ЭлементНастройкиПриемник.Расположение = СвойстваГруппы.Расположение;
	
	НаследникиЭлементовНастроек = Новый Соответствие;
	НаследникиЭлементовНастроек.Вставить(ЭлементНастройкиИсточник, ЭлементНастройкиПриемник);
	
	// Обработка строк.
	СтрокаИсточник = ПараметрыГруппировки.Родитель;
	СтрокаПриемник = СтрокаИсточник.ПолучитьЭлементы().Вставить(ПараметрыГруппировки.Индекс); // см. ЭлементКоллекцииФормыНастроек
	ЗаполнитьЗначенияСвойств(СтрокаПриемник, ЭлементНастройкиПриемник);
	СтрокаПриемник.Идентификатор = СвойствоЭлементаСтруктуры.ПолучитьИдентификаторПоОбъекту(ЭлементНастройкиПриемник);
	СтрокаПриемник.ЭтоГруппа = Истина;
	СтрокаПриемник.Картинка = ОтчетыКлиентСервер.ИндексКартинки("Группа");
	СтрокаПриемник.Заголовок = ЗаголовокГруппыВыбранныхПолей(ЭлементНастройкиПриемник);
	
	НаследникиСтрок = Новый Соответствие;
	НаследникиСтрок.Вставить(СтрокаИсточник, СтрокаПриемник);
	
	ИзменитьГруппировкуВыбранныхПолей(СвойствоЭлементаСтруктуры, ПараметрыГруппировки.Строки, НаследникиЭлементовНастроек, НаследникиСтрок);
	УдалитьБазовыеЭлементыГруппировкиВыбранныхПолей(СвойствоЭлементаСтруктуры, ПараметрыГруппировки);
	
	Раздел = ВыбранныеПоля.ПолучитьЭлементы()[0];
	Элементы.ВыбранныеПоля.Развернуть(Раздел.ПолучитьИдентификатор(), Истина);
	Элементы.ВыбранныеПоля.ТекущаяСтрока = СтрокаПриемник.ПолучитьИдентификатор();
	
	УстановитьМодифицированность();
КонецПроцедуры

&НаКлиенте
Процедура ИзменитьГруппировкуВыбранныхПолей(ВыбранныеПоляУзлаНастроек, Строки, НаследникиЭлементовНастроек, НаследникиСтрок)
	Для Каждого СтрокаИсточник Из Строки Цикл 
		ЭлементНастройкиИсточник = ВыбранныеПоляУзлаНастроек.ПолучитьОбъектПоИдентификатору(СтрокаИсточник.Идентификатор);
		
		Если ЭлементНастройкиИсточник.Родитель = Неопределено Тогда 
			РодительЭлементаНастройкиИсточника = ВыбранныеПоляУзлаНастроек;
		Иначе
			РодительЭлементаНастройкиИсточника = ЭлементНастройкиИсточник.Родитель;
		КонецЕсли;
		РодительЭлементаНастройкиПриемника = НаследникиЭлементовНастроек.Получить(РодительЭлементаНастройкиИсточника); // ГруппаВыбранныхПолейКомпоновкиДанных 
		
		РодительСтрокиИсточника = СтрокаИсточник.ПолучитьРодителя();
		РодительСтрокиПриемника = НаследникиСтрок.Получить(РодительСтрокиИсточника);
		
		Индекс = РодительЭлементаНастройкиПриемника.Элементы.Индекс(РодительЭлементаНастройкиИсточника);
		Если Индекс < 0 Тогда 
			ЭлементНастройкиПриемник = РодительЭлементаНастройкиПриемника.Элементы.Добавить(ТипЗнч(ЭлементНастройкиИсточник));
			СтрокаПриемник = РодительСтрокиПриемника.ПолучитьЭлементы().Добавить();
		Иначе // Это удаление группировки.
			ЭлементНастройкиПриемник = РодительЭлементаНастройкиПриемника.Элементы.Вставить(Индекс, ТипЗнч(ЭлементНастройкиИсточник));
			СтрокаПриемник = РодительСтрокиПриемника.ПолучитьЭлементы().Вставить(Индекс);
		КонецЕсли;
		
		ЗаполнитьЗначенияСвойств(ЭлементНастройкиПриемник, ЭлементНастройкиИсточник);
		ЗаполнитьЗначенияСвойств(СтрокаПриемник, СтрокаИсточник);
		СтрокаПриемник.Идентификатор = ВыбранныеПоляУзлаНастроек.ПолучитьИдентификаторПоОбъекту(ЭлементНастройкиПриемник);
		СтрокаПриемник.ЭтоГруппа = (ТипЗнч(ЭлементНастройкиПриемник) = Тип("ГруппаВыбранныхПолейКомпоновкиДанных"));
		
		НаследникиЭлементовНастроек.Вставить(ЭлементНастройкиИсточник, ЭлементНастройкиПриемник);
		НаследникиСтрок.Вставить(СтрокаИсточник, СтрокаПриемник);
		
		ИзменитьГруппировкуВыбранныхПолей(ВыбранныеПоляУзлаНастроек, СтрокаИсточник.ПолучитьЭлементы(), НаследникиЭлементовНастроек, НаследникиСтрок);
	КонецЦикла;
КонецПроцедуры

&НаКлиенте
Процедура УдалитьБазовыеЭлементыГруппировкиВыбранныхПолей(ВыбранныеПоляУзлаНастроек, ПараметрыГруппировки)
	Строки = ПараметрыГруппировки.Родитель.ПолучитьЭлементы();
	
	ЭлементыНастроек = ВыбранныеПоляУзлаНастроек.Элементы;
	Родитель = ПараметрыГруппировки.Родитель; // см. ЭлементКоллекцииФормыНастроек
	
	Если ТипЗнч(Родитель.Идентификатор) = Тип("ИдентификаторКомпоновкиДанных") Тогда 
		ЭлементыНастроек = ВыбранныеПоляУзлаНастроек.ПолучитьОбъектПоИдентификатору(Родитель.Идентификатор).Элементы;
	КонецЕсли;
	
	Индекс = ПараметрыГруппировки.Строки.ВГраница();
	Пока Индекс >= 0 Цикл 
		Строка = ПараметрыГруппировки.Строки[Индекс]; // см. ЭлементКоллекцииФормыНастроек
		ЭлементНастройки = ВыбранныеПоляУзлаНастроек.ПолучитьОбъектПоИдентификатору(Строка.Идентификатор);
		
		Строки.Удалить(Строка);
		ЭлементыНастроек.Удалить(ЭлементНастройки);
		
		Индекс = Индекс - 1;
	КонецЦикла;
КонецПроцедуры

&НаКлиентеНаСервереБезКонтекста
Функция ЗаголовокГруппыВыбранныхПолей(ЭлементНастройки)
	ЗаголовокГруппы = ЭлементНастройки.Заголовок;
	
	Если Не ЗначениеЗаполнено(ЗаголовокГруппы) Тогда 
		ЗаголовокГруппы = "(" + ЭлементНастройки.Расположение + ")";
	ИначеЕсли ЭлементНастройки.Расположение <> РасположениеПоляКомпоновкиДанных.Авто Тогда 
		ЗаголовокГруппы = ЗаголовокГруппы + " (" + ЭлементНастройки.Расположение + ")";
	КонецЕсли;
	
	Возврат ЗаголовокГруппы;
КонецФункции

// Перетаскивание элементов.

&НаКлиенте
Процедура ПроверитьПеретаскиваемыеСтрокиИзВыбранныхПолей(ИдентификаторыСтрок)
	Родители = Новый Массив;
	
	Индекс = ИдентификаторыСтрок.ВГраница();
	Пока Индекс >= 0 Цикл 
		ИдентификаторСтроки = ИдентификаторыСтрок[Индекс];
		
		Строка = ВыбранныеПоля.НайтиПоИдентификатору(ИдентификаторСтроки);
		Родитель = Строка.ПолучитьРодителя();
		
		Если Родитель = Неопределено
			Или Родитель.ПолучитьЭлементы().Индекс(Строка) < 0
			Или ТипЗнч(Строка.Идентификатор) <> Тип("ИдентификаторКомпоновкиДанных") Тогда 
			ИдентификаторыСтрок.Удалить(Индекс);
		Иначе
			Родители.Добавить(Родитель);
		КонецЕсли;
		
		Индекс = Индекс - 1;
	КонецЦикла;
	
	Родители = ОбщегоНазначенияКлиентСервер.СвернутьМассив(Родители);
	Если Родители.Количество() > 1 Тогда 
		ИдентификаторыСтрок.Очистить();
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура ПеретащитьВыбранныеПоляВПределахКоллекции(ПараметрыПеретаскивания, ТекущаяСтрока)
	ТекущиеДанные = ВыбранныеПоля.НайтиПоИдентификатору(ТекущаяСтрока);
	
	Строки = Новый Массив;
	Для Каждого ИдентификаторСтроки Из ПараметрыПеретаскивания.Значение Цикл 
		Строки.Добавить(ВыбранныеПоля.НайтиПоИдентификатору(ИдентификаторСтроки));
	КонецЦикла;
	
	СтрокаИсточник = Строки[0].ПолучитьРодителя(); // см. ЭлементКоллекцииФормыНастроек
	Если ТекущиеДанные.ЭтоРаздел Или ТекущиеДанные.ЭтоГруппа Тогда 
		СтрокаПриемник = ТекущиеДанные;
	Иначе
		СтрокаПриемник = ТекущиеДанные.ПолучитьРодителя();
	КонецЕсли;
	
	Индекс = СтрокаПриемник.ПолучитьЭлементы().Индекс(ТекущиеДанные);
	Если Индекс < 0 Тогда 
		Индекс = 0;
	КонецЕсли;
	
	НаследникиСтрок = Новый Соответствие;
	НаследникиСтрок.Вставить(СтрокаИсточник, СтрокаПриемник);
	
	СвойствоЭлементаСтруктуры = СвойствоЭлементаСтруктурыНастроек(
		Отчет.КомпоновщикНастроек, "Выбор", ИдентификаторЭлементаСтруктурыНастроек, РасширенныйРежим);
	
	ЭлементНастройкиИсточник = СвойствоЭлементаСтруктуры;
	Если ТипЗнч(СтрокаИсточник.Идентификатор) = Тип("ИдентификаторКомпоновкиДанных") Тогда 
		ЭлементНастройкиИсточник = СвойствоЭлементаСтруктуры.ПолучитьОбъектПоИдентификатору(СтрокаИсточник.Идентификатор);
	КонецЕсли;
	
	ЭлементНастройкиПриемник = СвойствоЭлементаСтруктуры;
	Если ТипЗнч(СтрокаПриемник.Идентификатор) = Тип("ИдентификаторКомпоновкиДанных") Тогда 
		ЭлементНастройкиПриемник = СвойствоЭлементаСтруктуры.ПолучитьОбъектПоИдентификатору(СтрокаПриемник.Идентификатор);
	КонецЕсли;
	
	НаследникиЭлементовНастроек = Новый Соответствие;
	НаследникиЭлементовНастроек.Вставить(ЭлементНастройкиИсточник, ЭлементНастройкиПриемник);
	
	ПеретащитьВыбранныеПоля(СвойствоЭлементаСтруктуры, Индекс, Строки, НаследникиЭлементовНастроек, НаследникиСтрок);
	
	Элементы.ВыбранныеПоля.Развернуть(ВыбранныеПоля.ПолучитьЭлементы()[0].ПолучитьИдентификатор(), Истина);
	
	УстановитьМодифицированность();
КонецПроцедуры

// Параметры:
//  ВыбранныеПоляУзлаНастроек - ГруппаВыбранныхПолейКомпоновкиДанных
//                            - ВыбранныеПоляКомпоновкиДанных
//                            - ВыбранноеПолеКомпоновкиДанных
//  Индекс - Число
//  Строки - Массив из ДанныеФормыЭлементДерева:
//    * Идентификатор - ИдентификаторКомпоновкиДанных
//  НаследникиЭлементовНастроек - Соответствие
//  НаследникиСтрок - Соответствие
//
&НаКлиенте
Процедура ПеретащитьВыбранныеПоля(ВыбранныеПоляУзлаНастроек, Индекс, Строки, НаследникиЭлементовНастроек, НаследникиСтрок)
	Для Каждого СтрокаИсточник Из Строки Цикл
		ЭлементНастройкиИсточник = ВыбранныеПоляУзлаНастроек.ПолучитьОбъектПоИдентификатору(СтрокаИсточник.Идентификатор);
		
		РодительЭлементаНастройкиИсточник = ВыбранныеПоляУзлаНастроек;
		Если ЭлементНастройкиИсточник.Родитель <> Неопределено Тогда 
			РодительЭлементаНастройкиИсточник = ЭлементНастройкиИсточник.Родитель;
		КонецЕсли;
		
		РодительЭлементаНастройкиПриемник = НаследникиЭлементовНастроек.Получить(РодительЭлементаНастройкиИсточник); // ГруппаВыбранныхПолейКомпоновкиДанных
		РодительСтрокиПриемник = НаследникиСтрок.Получить(СтрокаИсточник.ПолучитьРодителя()); // см. ЭлементКоллекцииФормыНастроек
		
		Если Индекс > РодительЭлементаНастройкиПриемник.Элементы.Количество() - 1 Тогда 
			ЭлементНастройкиПриемник = РодительЭлементаНастройкиПриемник.Элементы.Добавить(ТипЗнч(ЭлементНастройкиИсточник));
			СтрокаПриемник = РодительСтрокиПриемник.ПолучитьЭлементы().Добавить();
		Иначе
			ЭлементНастройкиПриемник = РодительЭлементаНастройкиПриемник.Элементы.Вставить(Индекс, ТипЗнч(ЭлементНастройкиИсточник));
			СтрокаПриемник = РодительСтрокиПриемник.ПолучитьЭлементы().Вставить(Индекс);
		КонецЕсли;
		
		ЗаполнитьЗначенияСвойств(ЭлементНастройкиПриемник, ЭлементНастройкиИсточник);
		ЗаполнитьЗначенияСвойств(СтрокаПриемник, СтрокаИсточник);
		СтрокаПриемник.Идентификатор = ВыбранныеПоляУзлаНастроек.ПолучитьИдентификаторПоОбъекту(ЭлементНастройкиПриемник);
		СтрокаПриемник.Картинка = ОтчетыКлиентСервер.ИндексКартинки("Элемент");
		СтрокаПриемник.ЭтоГруппа = (ТипЗнч(ЭлементНастройкиПриемник) = Тип("ГруппаВыбранныхПолейКомпоновкиДанных"));
		
		НаследникиЭлементовНастроек.Вставить(ЭлементНастройкиИсточник, ЭлементНастройкиПриемник);
		НаследникиСтрок.Вставить(СтрокаИсточник, СтрокаПриемник);
		
		Если ТипЗнч(ЭлементНастройкиПриемник) = Тип("ГруппаВыбранныхПолейКомпоновкиДанных") Тогда 
			СтрокаПриемник.Картинка = ОтчетыКлиентСервер.ИндексКартинки("Группа");
			ПеретащитьВыбранныеПоля(ВыбранныеПоляУзлаНастроек, Индекс, СтрокаИсточник.ПолучитьЭлементы(), НаследникиЭлементовНастроек, НаследникиСтрок)
		КонецЕсли;
	КонецЦикла;
КонецПроцедуры

// Сдвиг элементов.

&НаКлиенте
Процедура СдвинутьВыбранныеПоля(ВНачало = Истина)
	ПараметрыСдвига = ПараметрыСдвигаВыбранныхПолей();
	Если ПараметрыСдвига = Неопределено Тогда 
		Возврат;
	КонецЕсли;
	
	СвойствоЭлементаСтруктуры = СвойствоЭлементаСтруктурыНастроек(
		Отчет.КомпоновщикНастроек, "Выбор", ИдентификаторЭлементаСтруктурыНастроек, РасширенныйРежим);
	
	Для Каждого Строка Из ПараметрыСдвига.Строки Цикл 
		ЭлементНастройки = ЭлементНастройки(СвойствоЭлементаСтруктуры, Строка);
		
		ЭлементыНастроек = СвойствоЭлементаСтруктуры.Элементы;
		Если ЭлементНастройки.Родитель <> Неопределено Тогда 
			ЭлементыНастроек = ЭлементНастройки.Родитель.Элементы;
		КонецЕсли;
		Строки = ПараметрыСдвига.Родитель.ПолучитьЭлементы();
		
		Индекс = ЭлементыНастроек.Индекс(ЭлементНастройки);
		Граница = ЭлементыНастроек.Количество() - 1;
		
		Если ВНачало Тогда // Сдвиг в начало коллекции.
			Если Индекс = 0 Тогда 
				ЭлементыНастроек.Сдвинуть(ЭлементНастройки, Граница);
				Строки.Сдвинуть(Индекс, Граница);
			Иначе
				ЭлементыНастроек.Сдвинуть(ЭлементНастройки, -1);
				Строки.Сдвинуть(Индекс, -1);
			КонецЕсли;
		Иначе // Сдвиг в конец коллекции.
			Если Индекс = Граница Тогда 
				ЭлементыНастроек.Сдвинуть(ЭлементНастройки, -Граница);
				Строки.Сдвинуть(Индекс, -Граница);
			Иначе
				ЭлементыНастроек.Сдвинуть(ЭлементНастройки, 1);
				Строки.Сдвинуть(Индекс, 1);
			КонецЕсли;
		КонецЕсли;
	КонецЦикла;
	
	УстановитьМодифицированность();
КонецПроцедуры

&НаКлиенте
Функция ПараметрыСдвигаВыбранныхПолей()
	Строки = Новый Массив;
	Родители = Новый Массив;
	
	ИдентификаторыСтрок = Элементы.ВыбранныеПоля.ВыделенныеСтроки;
	Для Каждого ИдентификаторСтроки Из ИдентификаторыСтрок Цикл 
		Строка = ВыбранныеПоля.НайтиПоИдентификатору(ИдентификаторСтроки);
		Родитель = Строка.ПолучитьРодителя();
		
		Если Родитель = Неопределено Или Родитель.ПолучитьЭлементы().Индекс(Строка) < 0
			Или ТипЗнч(Строка.Идентификатор) <> Тип("ИдентификаторКомпоновкиДанных") Тогда 
			Продолжить;
		КонецЕсли;
		
		Строки.Добавить(Строка);
		Родители.Добавить(Родитель);
	КонецЦикла;
	
	Если Строки.Количество() = 0 Тогда 
		ПоказатьПредупреждение(, НСтр("ru = 'Выберите элементы.'"));
		Возврат Неопределено;
	КонецЕсли;
	
	Родители = ОбщегоНазначенияКлиентСервер.СвернутьМассив(Родители);
	Если Родители.Количество() > 1 Тогда 
		ПоказатьПредупреждение(, НСтр("ru = 'Выбранные элементы не могут быть перемещены, поскольку они принадлежат разным родителям.'"));
		Возврат Неопределено;
	КонецЕсли;
	
	Возврат Новый Структура("Строки, Родитель", МассивСортировать(Строки), Родители[0]);
КонецФункции

// Общее

&НаКлиентеНаСервереБезКонтекста
Процедура ПривестиЗначениеКВидуСравнения(Строка, ЭлементНастройки = Неопределено)
	ИмяПоляЗначения = ?(Строка.ЭтоПараметр, "Значение", "ПравоеЗначение");
	ТекущееЗначение = Строка[ИмяПоляЗначения];
	
	Если Строка.ДоступенСписокЗначений
		Или ОтчетыКлиентСервер.ЭтоВидСравненияСписка(Строка.ВидСравнения) Тогда 
		
		Если ТипЗнч(ТекущееЗначение) = Тип("СтандартнаяДатаНачала") Тогда
			ТекущееЗначение = ТекущееЗначение.Дата;
		КонецЕсли;
		
		Значение = ОтчетыКлиентСервер.ЗначенияСписком(ТекущееЗначение);
		Значение.ЗаполнитьПометки(Истина);
		
		Если Строка.ДоступныеЗначения <> Неопределено Тогда 
			Для Каждого ЭлементСписка Из Значение Цикл 
				НайденныйЭлемент = Строка.ДоступныеЗначения.НайтиПоЗначению(ЭлементСписка.Значение);
				Если НайденныйЭлемент <> Неопределено Тогда 
					ЗаполнитьЗначенияСвойств(ЭлементСписка, НайденныйЭлемент,, "Пометка");
				КонецЕсли;
			КонецЦикла;
		КонецЕсли;
	Иначе
		Значение = Неопределено;
		Если ТипЗнч(ТекущееЗначение) <> Тип("СписокЗначений") Тогда 
			Значение = ТекущееЗначение;
		ИначеЕсли ТекущееЗначение.Количество() > 0 Тогда 
			Значение = ТекущееЗначение[0].Значение;
		КонецЕсли;
	КонецЕсли;
	
	Строка[ИмяПоляЗначения] = Значение;
	
	Если ТипЗнч(ЭлементНастройки) = Тип("ЗначениеПараметраНастроекКомпоновкиДанных")
		Или ТипЗнч(ЭлементНастройки) = Тип("ЭлементОтбораКомпоновкиДанных") Тогда 
		ЭлементНастройки[ИмяПоляЗначения] = Значение;
	КонецЕсли;
КонецПроцедуры

&НаКлиентеНаСервереБезКонтекста
Процедура УстановитьПредставлениеЗначения(Строка)
	Строка.ПредставлениеЗначения = "";
	
	ДоступныеЗначения = Строка.ДоступныеЗначения;
	Если ДоступныеЗначения = Неопределено Тогда 
		Возврат;
	КонецЕсли;
	
	Значение = ?(Строка.ЭтоПараметр, Строка.Значение, Строка.ПравоеЗначение);
	НайденныйЭлемент = ДоступныеЗначения.НайтиПоЗначению(Значение);
	Если НайденныйЭлемент <> Неопределено Тогда 
		Строка.ПредставлениеЗначения = НайденныйЭлемент.Представление;
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура УстановитьПараметрыРедактирования(Строка)
	КомпоновщикНастроек = Отчет.КомпоновщикНастроек;
	
	Если Строка.ЭтоПараметр Тогда 
		ПолеЗначения = Элементы.ОтборыЗначение;
		СвойствоЭлементаСтруктуры = СвойствоЭлементаСтруктурыНастроек(КомпоновщикНастроек, "ПараметрыДанных");
	Иначе
		ПолеЗначения = Элементы.ОтборыПравоеЗначение;
		СвойствоЭлементаСтруктуры = СвойствоЭлементаСтруктурыНастроек(
			КомпоновщикНастроек, "Отбор", ИдентификаторЭлементаСтруктурыНастроек);
	КонецЕсли;
	
	ПользовательскиеНастройки = КомпоновщикНастроек.ПользовательскиеНастройки.Элементы;
	
	ТекущиеНастройки = ЭлементСтруктурыНастроек(КомпоновщикНастроек.Настройки, ИдентификаторЭлементаСтруктурыНастроек);
	ЭлементНастройки = ЭлементНастройки(СвойствоЭлементаСтруктуры, Строка);
	ОписаниеЭлементаНастройки = ОтчетыКлиентСервер.НайтиДоступнуюНастройку(ТекущиеНастройки, ЭлементНастройки);
	
	ПолеЗначения.ПараметрыВыбора = ОтчетыКлиентСервер.ПараметрыВыбора(ТекущиеНастройки, ПользовательскиеНастройки, ЭлементНастройки, РасширенныйРежим = 1);
	
	Строка.ТипЗначения = ОтчетыКлиент.ТипЗначенияОграниченныйСвязьюПоТипу(
		ТекущиеНастройки, ПользовательскиеНастройки, ЭлементНастройки, ОписаниеЭлементаНастройки);
	
	ПолеЗначения.ДоступныеТипы = Строка.ТипЗначения;
КонецПроцедуры

&НаКлиенте
Функция ВыборПереопределен(Строка, СтандартнаяОбработка)
	
	Если Строка.ЭтоПараметр Тогда
		ПолеЗначения = Элементы.ОтборыЗначение;
		ТекущееЗначение = Строка.Значение;
	Иначе
		ПолеЗначения = Элементы.ОтборыПравоеЗначение;
		ТекущееЗначение = Строка.ПравоеЗначение;
	КонецЕсли;
	
	Обработчик = Новый ОписаниеОповещения("ЗавершитьВыборИзСписка", ЭтотОбъект, Строка.ПолучитьИдентификатор());
	
	КлючСвойства = КлючСвойстваЭлементаСтруктурыНастроек("Отборы", Строка);
	
	СвойствоЭлементаСтруктуры = СвойствоЭлементаСтруктурыНастроек(
		Отчет.КомпоновщикНастроек, КлючСвойства, ИдентификаторЭлементаСтруктурыНастроек);
	
	ЭлементНастройки = ЭлементНастройки(СвойствоЭлементаСтруктуры, Строка);
	Описание = ОтчетыКлиентСервер.НайтиДоступнуюНастройку(Отчет.КомпоновщикНастроек.Настройки, ЭлементНастройки);
	
	Если ОтчетыКлиент.ВыборПереопределен(ЭтотОбъект, Обработчик, Описание, Строка.ТипЗначения,
		ОтчетыКлиентСервер.ЗначенияСписком(ТекущееЗначение), ПолеЗначения.ПараметрыВыбора) Тогда
		
		СтандартнаяОбработка = Ложь;
		Возврат Истина;
	КонецЕсли;
	
	Возврат Ложь;
	
КонецФункции

&НаКлиенте
Процедура ПоказатьСписокВыбора(Строка, СтандартнаяОбработка, Элемент)
	СтандартнаяОбработка = Ложь;
	
	Если Строка.ЭтоПараметр Тогда 
		ПолеЗначения = Элементы.ОтборыЗначение;
		ТекущееЗначение = Строка.Значение;
	Иначе
		ПолеЗначения = Элементы.ОтборыПравоеЗначение;
		ТекущееЗначение = Строка.ПравоеЗначение;
	КонецЕсли;
	
	Обработчик = Новый ОписаниеОповещения("ЗавершитьВыборИзСписка", ЭтотОбъект, Строка.ПолучитьИдентификатор());
	
	Если ОтчетыКлиент.ЭтоВыборОбъектовМетаданных(Строка.ТипЗначения, ТекущееЗначение, Обработчик)
		Или ОтчетыКлиент.ЭтоВыборПользователей(ЭтотОбъект, Элемент, Строка.ТипЗначения, ТекущееЗначение, ПолеЗначения.ПараметрыВыбора, Обработчик) Тогда 
		Возврат;
	КонецЕсли;
	
	ЗначенияДляВыбора = ЗначенияДляВыбора(Строка);
	
	ПараметрыОткрытия = Новый Структура;
	ПараметрыОткрытия.Вставить("Отмеченные", ОтчетыКлиентСервер.ЗначенияСписком(ТекущееЗначение));
	ПараметрыОткрытия.Вставить("ОписаниеТипов", Строка.ТипЗначения);
	ПараметрыОткрытия.Вставить("ЗначенияДляВыбора", ЗначенияДляВыбора);
	ПараметрыОткрытия.Вставить("ЗначенияДляВыбораЗаполнены", ЗначенияДляВыбора.Количество() > 0);
	ПараметрыОткрытия.Вставить("ОграничиватьВыборУказаннымиЗначениями", Строка.ДоступныеЗначения <> Неопределено);
	ПараметрыОткрытия.Вставить("Представление", Строка.ПредставлениеПользовательскойНастройки);
	ПараметрыОткрытия.Вставить("ПараметрыВыбора", Новый Массив(ПолеЗначения.ПараметрыВыбора));
	ПараметрыОткрытия.Вставить("ВыборГруппИЭлементов", ПолеЗначения.ВыборГруппИЭлементов);
	
	ОткрытьФорму("ОбщаяФорма.ВводЗначенийСпискомСФлажками", ПараметрыОткрытия, ЭтотОбъект,,,, Обработчик);
КонецПроцедуры

&НаКлиенте
Функция ЗначенияДляВыбора(Строка)
	ЗначенияДляВыбора = ОбщегоНазначенияКлиент.СкопироватьРекурсивно(Строка.ДоступныеЗначения);
	
	Если ЗначенияДляВыбора = Неопределено Тогда 
		ЗначенияДляВыбора = Новый СписокЗначений;
	КонецЕсли;
	
	ЗначенияДляВыбора.ТипЗначения = Строка.ТипЗначения;
	
	СвойствоЭлементаСтруктуры = СвойствоЭлементаСтруктурыНастроек(
		Отчет.КомпоновщикНастроек, ?(Строка.ЭтоПараметр, "ПараметрыДанных", "Отбор"));
	
	ЭлементНастройки = ЭлементНастройки(СвойствоЭлементаСтруктуры, Строка);
	Если ЭлементНастройки = Неопределено Тогда 
		Возврат ЗначенияДляВыбора;
	КонецЕсли;
	
	ЗначениеОтбора = ОтчетыКлиент.КэшЗначенияОтбора(Отчет.КомпоновщикНастроек, ЭлементНастройки);
	Если ЗначениеОтбора <> Неопределено Тогда 
		ОбщегоНазначенияКлиентСервер.ДополнитьСписок(ЗначенияДляВыбора, ЗначениеОтбора);
	КонецЕсли;
	
	ОтчетыКлиент.ОбновитьПредставленияСписка(ЗначенияДляВыбора, Строка.ДоступныеЗначения);
	
	Возврат ЗначенияДляВыбора;
КонецФункции

&НаКлиенте
Процедура ЗавершитьВыборИзСписка(Список, ИдентификаторСтроки) Экспорт
	Если ТипЗнч(Список) = Тип("Массив") Тогда
		ВыбранныеЗначения = Список;
		
		Список = Новый СписокЗначений;
		Список.ЗагрузитьЗначения(ВыбранныеЗначения);
		Список.ЗаполнитьПометки(Истина);
	ИначеЕсли ТипЗнч(Список) <> Тип("СписокЗначений") Тогда
		Возврат;
	КонецЕсли;
	
	Строка = Отборы.НайтиПоИдентификатору(ИдентификаторСтроки);
	Если Строка = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	ВыбранныеЗначения = Новый СписокЗначений;
	Для Каждого ЭлементСписка Из Список Цикл 
		Если ЭлементСписка.Пометка Тогда 
			ЗаполнитьЗначенияСвойств(ВыбранныеЗначения.Добавить(), ЭлементСписка);
		КонецЕсли;
	КонецЦикла;
	
	ИмяПоляЗначения = ?(Строка.ЭтоПараметр, "Значение", "ПравоеЗначение");
	КлючСвойства = КлючСвойстваЭлементаСтруктурыНастроек("Отборы", Строка);
	
	Строка[ИмяПоляЗначения] = ВыбранныеЗначения;
	Строка.Использование = Истина;
	
	СвойствоЭлементаСтруктуры = СвойствоЭлементаСтруктурыНастроек(
		Отчет.КомпоновщикНастроек, КлючСвойства, ИдентификаторЭлементаСтруктурыНастроек);
	
	ЭлементНастройки = ЭлементНастройки(СвойствоЭлементаСтруктуры, Строка);
	ЗаполнитьЗначенияСвойств(ЭлементНастройки, Строка, "Использование, " + ИмяПоляЗначения);
	
	ОтчетыКлиент.КэшироватьЗначениеОтбора(КомпоновщикНастроек, ЭлементНастройки, Список);
	
	УстановитьМодифицированность();
КонецПроцедуры

#КонецОбласти

#Область Порядок

// Чтение настроек.

&НаСервере
Процедура ОбновитьСортировку()
	СвойствоЭлементаСтруктуры = СвойствоЭлементаСтруктурыНастроек(
		Отчет.КомпоновщикНастроек, "Порядок", ИдентификаторЭлементаСтруктурыНастроек, РасширенныйРежим);
	
	Если СвойствоЭлементаСтруктуры = Неопределено Тогда 
		Возврат;
	КонецЕсли;
	
	Раздел = Сортировка.ПолучитьЭлементы().Добавить();
	Раздел.ЭтоРаздел = Истина;
	Раздел.Заголовок = НСтр("ru = 'Сортировки'");
	Раздел.Картинка = ВариантыОтчетовСлужебныйКлиентСервер.ИндексКартинкиПоля(Неопределено);
	Строки = Раздел.ПолучитьЭлементы();
	
	ЭлементыНастроек = СвойствоЭлементаСтруктуры.Элементы;
	
	Для Каждого ЭлементНастройки Из ЭлементыНастроек Цикл 
		Строка = Строки.Добавить();
		ЗаполнитьЗначенияСвойств(Строка, ЭлементНастройки);
		Строка.Идентификатор = СвойствоЭлементаСтруктуры.ПолучитьИдентификаторПоОбъекту(ЭлементНастройки);
		
		Если ТипЗнч(ЭлементНастройки) = Тип("АвтоЭлементПорядкаКомпоновкиДанных") Тогда 
			Строка.Заголовок = НСтр("ru = 'Авто (сортировки родителя)'");
			Строка.ЭтоАвтоПоле = Истина;
			Строка.Картинка = 18;
			Продолжить;
		КонецЕсли;
		
		ОписаниеНастройки = СвойствоЭлементаСтруктуры.ДоступныеПоляПорядка.НайтиПоле(ЭлементНастройки.Поле);
		Если ОписаниеНастройки = Неопределено Тогда 
			УстановитьПометкуУдаления("Сортировка", Строка);
		Иначе
			ЗаполнитьЗначенияСвойств(Строка, ОписаниеНастройки);
			Строка.Картинка = ВариантыОтчетовСлужебныйКлиентСервер.ИндексКартинкиПоля(ОписаниеНастройки.ТипЗначения);
		КонецЕсли;
	КонецЦикла;
КонецПроцедуры

// Добавление, изменение элементов.

&НаКлиенте
Процедура СортировкаВыбратьПоле(ИдентификаторСтроки, Строка)
	СвойствоЭлементаСтруктуры = СвойствоЭлементаСтруктурыНастроек(
		Отчет.КомпоновщикНастроек, "Порядок", ИдентификаторЭлементаСтруктурыНастроек, РасширенныйРежим);
	
	ЭлементНастройки = ЭлементНастройки(СвойствоЭлементаСтруктуры, Строка);
	
	Обработчик = Новый ОписаниеОповещения("СортировкаПослеВыбораПоля", ЭтотОбъект, ИдентификаторСтроки);
	ВыбратьПоле("Сортировка", Обработчик, ЭлементНастройки.Поле);
КонецПроцедуры

&НаКлиенте
Процедура СортировкаПослеВыбораПоля(ОписаниеНастройки, ИдентификаторСтроки = Неопределено) Экспорт
	Если ОписаниеНастройки = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	Настройки = Отчет.КомпоновщикНастроек.Настройки;
	ВариантыОтчетовСлужебныйКлиент.ДобавитьФормулу(Настройки, Настройки.ДоступныеПоляПорядка, ОписаниеНастройки);
	
	СвойствоЭлементаСтруктуры = СвойствоЭлементаСтруктурыНастроек(
		Отчет.КомпоновщикНастроек, "Порядок", ИдентификаторЭлементаСтруктурыНастроек, РасширенныйРежим);
	
	Если ИдентификаторСтроки = Неопределено Тогда 
		Родитель = Элементы.Сортировка.ТекущиеДанные;
		Если Родитель = Неопределено Тогда
			Родитель = КорневаяСтрокаПоУмолчанию("Сортировка");
		КонецЕсли;
		Если Не Родитель.ЭтоРаздел Тогда 
			Родитель = Родитель.ПолучитьРодителя();
		КонецЕсли;
		Строка = Родитель.ПолучитьЭлементы().Добавить();
		
		РодительЭлементаНастройки = СвойствоЭлементаСтруктуры;
		Если ТипЗнч(Родитель.Идентификатор) = Тип("ИдентификаторКомпоновкиДанных") Тогда 
			РодительЭлементаНастройки = СвойствоЭлементаСтруктуры.ПолучитьОбъектПоИдентификатору(Родитель.Идентификатор);
		КонецЕсли;
		ЭлементНастройки = РодительЭлементаНастройки.Элементы.Добавить(Тип("ЭлементПорядкаКомпоновкиДанных"));
	Иначе
		Строка = Сортировка.НайтиПоИдентификатору(ИдентификаторСтроки);
		ЭлементНастройки = ЭлементНастройки(СвойствоЭлементаСтруктуры, Строка);
	КонецЕсли;
	
	ЭлементНастройки.Использование = Истина;
	ЭлементНастройки.Поле = ОписаниеНастройки.Поле;
	
	ЗаполнитьЗначенияСвойств(Строка, ЭлементНастройки);
	ЗаполнитьЗначенияСвойств(Строка, ОписаниеНастройки);
	
	Строка.Идентификатор = СвойствоЭлементаСтруктуры.ПолучитьИдентификаторПоОбъекту(ЭлементНастройки);
	Строка.Картинка = ОтчетыКлиентСервер.ИндексКартинки("Элемент");
	
	Элементы.Сортировка.Развернуть(Сортировка.ПолучитьЭлементы()[0].ПолучитьИдентификатор());
	
	УстановитьМодифицированность();
КонецПроцедуры

&НаКлиенте
Процедура ИзменитьТипУпорядочиванияСтрок(ТипУпорядочивания)
	Строки = Сортировка.ПолучитьЭлементы()[0].ПолучитьЭлементы();
	Если Строки.Количество() = 0 Тогда 
		Возврат;
	КонецЕсли;
	
	СвойствоЭлементаСтруктуры = СвойствоЭлементаСтруктурыНастроек(
		Отчет.КомпоновщикНастроек, "Порядок", ИдентификаторЭлементаСтруктурыНастроек, РасширенныйРежим);
	
	Для Каждого Строка Из Строки Цикл 
		ЭлементНастройки = ЭлементНастройки(СвойствоЭлементаСтруктуры, Строка);
		ЭлементНастройки.ТипУпорядочивания = ТипУпорядочивания;
		Строка.ТипУпорядочивания = ЭлементНастройки.ТипУпорядочивания;
	КонецЦикла;
	
	УстановитьМодифицированность();
КонецПроцедуры

&НаКлиенте
Процедура ИзменитьТипУпорядочивания(Строка)
	СвойствоЭлементаСтруктуры = СвойствоЭлементаСтруктурыНастроек(
		Отчет.КомпоновщикНастроек, "Порядок", ИдентификаторЭлементаСтруктурыНастроек, РасширенныйРежим);
	
	ЭлементНастройки = ЭлементНастройки(СвойствоЭлементаСтруктуры, Строка);
	
	Если ЭлементНастройки.ТипУпорядочивания = НаправлениеСортировкиКомпоновкиДанных.Возр Тогда 
		ЭлементНастройки.ТипУпорядочивания = НаправлениеСортировкиКомпоновкиДанных.Убыв;
	Иначе
		ЭлементНастройки.ТипУпорядочивания = НаправлениеСортировкиКомпоновкиДанных.Возр;
	КонецЕсли;
	Строка.ТипУпорядочивания = ЭлементНастройки.ТипУпорядочивания;
	
	УстановитьМодифицированность();
КонецПроцедуры

// Перетаскивание элементов.

// Параметры:
//  Строки - Массив из ДанныеФормыЭлементДерева:
//    * Идентификатор - ИдентификаторКомпоновкиДанных
//
&НаКлиенте
Процедура ПеретащитьВыбранныеПоляВСортировку(Строки)
	ВыбранныеПоляЭлементаСтруктуры = СвойствоЭлементаСтруктурыНастроек(
		Отчет.КомпоновщикНастроек, "Выбор", ИдентификаторЭлементаСтруктурыНастроек, РасширенныйРежим);
	
	СортировкаЭлементаСтруктуры = СвойствоЭлементаСтруктурыНастроек(
		Отчет.КомпоновщикНастроек, "Порядок", ИдентификаторЭлементаСтруктурыНастроек, РасширенныйРежим);
	
	Раздел = Сортировка.ПолучитьЭлементы()[0];
	
	Для Каждого СтрокаИсточник Из Строки Цикл 
		ЭлементНастройкиИсточник = ВыбранныеПоляЭлементаСтруктуры.ПолучитьОбъектПоИдентификатору(СтрокаИсточник.Идентификатор);
		Если ТипЗнч(ЭлементНастройкиИсточник) = Тип("ГруппаВыбранныхПолейКомпоновкиДанных") Тогда 
			ПеретащитьВыбранныеПоляВСортировку(СтрокаИсточник.ПолучитьЭлементы());
		ИначеЕсли ТипЗнч(ЭлементНастройкиИсточник) = Тип("АвтоВыбранноеПолеКомпоновкиДанных") Тогда
			Найден = Ложь;
			Для Каждого ЭлементНастройкиПриемник Из СортировкаЭлементаСтруктуры.Элементы Цикл
				Если ТипЗнч(ЭлементНастройкиПриемник) = Тип("АвтоЭлементПорядкаКомпоновкиДанных") Тогда
					Найден = Истина;
					Прервать;
				КонецЕсли;
			КонецЦикла;
			Если Не Найден Тогда
				ЭлементНастройкиПриемник = СортировкаЭлементаСтруктуры.Элементы.Добавить(Тип("АвтоЭлементПорядкаКомпоновкиДанных"));
				ЭлементНастройкиПриемник.Использование = Истина;
				СтрокаПриемник = Раздел.ПолучитьЭлементы().Добавить();
				ЗаполнитьЗначенияСвойств(СтрокаПриемник, ЭлементНастройкиПриемник);
				СтрокаПриемник.Идентификатор = СортировкаЭлементаСтруктуры.ПолучитьИдентификаторПоОбъекту(ЭлементНастройкиПриемник);
				СтрокаПриемник.Картинка = 18;
				СтрокаПриемник.Заголовок = НСтр("ru = 'Авто (сортировки родителя)'");
				СтрокаПриемник.ЭтоАвтоПоле = Истина;
			КонецЕсли;
		Иначе
			Если НайтиПолеПорядка(СортировкаЭлементаСтруктуры, ЭлементНастройкиИсточник.Поле) <> Неопределено Тогда 
				Продолжить;
			КонецЕсли;
			
			ЭлементНастройкиПриемник = СортировкаЭлементаСтруктуры.Элементы.Добавить(Тип("ЭлементПорядкаКомпоновкиДанных"));
			ЗаполнитьЗначенияСвойств(ЭлементНастройкиПриемник, ЭлементНастройкиИсточник);
			ЭлементНастройкиПриемник.Использование = Истина;
			
			ОписаниеНастройки = СортировкаЭлементаСтруктуры.ДоступныеПоляПорядка.НайтиПоле(ЭлементНастройкиИсточник.Поле);
			
			СтрокаПриемник = Раздел.ПолучитьЭлементы().Добавить();
			ЗаполнитьЗначенияСвойств(СтрокаПриемник, ЭлементНастройкиПриемник);
			ЗаполнитьЗначенияСвойств(СтрокаПриемник, ОписаниеНастройки);
			СтрокаПриемник.Идентификатор = СортировкаЭлементаСтруктуры.ПолучитьИдентификаторПоОбъекту(ЭлементНастройкиПриемник);
			СтрокаПриемник.Картинка = ВариантыОтчетовСлужебныйКлиентСервер.ИндексКартинкиПоля(ОписаниеНастройки.ТипЗначения);
		КонецЕсли;
	КонецЦикла;
	
	Элементы.Сортировка.Развернуть(Раздел.ПолучитьИдентификатор());
	УстановитьМодифицированность();
КонецПроцедуры

&НаКлиенте
Процедура ПеретащитьСортировкуВнутриКоллекции(ПараметрыПеретаскивания, ТекущаяСтрока)
	
КонецПроцедуры

&НаКлиенте
Функция НайтиПолеПорядка(СортировкаУзлаНастроек, Поле)
	Для Каждого ЭлементНастройки Из СортировкаУзлаНастроек.Элементы Цикл 
		Если ТипЗнч(ЭлементНастройки) <> Тип("АвтоЭлементПорядкаКомпоновкиДанных")
			И ЭлементНастройки.Поле = Поле Тогда 
			
			Возврат Поле;
		КонецЕсли;
	КонецЦикла;
	
	Возврат Неопределено;
КонецФункции

&НаКлиенте
Процедура ПеретащитьПоляСортировкиВВыбранныеПоля(Строки)
	ВыбранныеПоляЭлементаСтруктуры = СвойствоЭлементаСтруктурыНастроек(
		Отчет.КомпоновщикНастроек, "Выбор", ИдентификаторЭлементаСтруктурыНастроек, РасширенныйРежим);
	
	СортировкаЭлементаСтруктуры = СвойствоЭлементаСтруктурыНастроек(
		Отчет.КомпоновщикНастроек, "Порядок", ИдентификаторЭлементаСтруктурыНастроек, РасширенныйРежим);
	
	РазделВыбранныхПолей = ВыбранныеПоля.ПолучитьЭлементы()[0];
	РазделПолейСортировки = Сортировка.ПолучитьЭлементы()[0];
	
	Индекс = Строки.Количество() - 1;
	Пока Индекс >= 0 Цикл 
		СтрокаИсточник = Строки[Индекс];
		ЭлементНастройкиИсточник = СортировкаЭлементаСтруктуры.ПолучитьОбъектПоИдентификатору(СтрокаИсточник.Идентификатор);
		
		Если ТипЗнч(ЭлементНастройкиИсточник) = Тип("АвтоЭлементПорядкаКомпоновкиДанных") Тогда
			Найден = Ложь;
			Для Каждого ЭлементНастройкиПриемник Из ВыбранныеПоляЭлементаСтруктуры.Элементы Цикл
				Если ТипЗнч(ЭлементНастройкиПриемник) = Тип("АвтоВыбранноеПолеКомпоновкиДанных") Тогда
					Найден = Истина;
					Прервать;
				КонецЕсли;
			КонецЦикла;
			Если Не Найден Тогда
				ЭлементНастройкиПриемник = ВыбранныеПоляЭлементаСтруктуры.Элементы.Добавить(Тип("АвтоВыбранноеПолеКомпоновкиДанных"));
				СтрокаПриемник = РазделВыбранныхПолей.ПолучитьЭлементы().Добавить();
				ЗаполнитьЗначенияСвойств(СтрокаПриемник, ЭлементНастройкиПриемник);
				СтрокаПриемник.Идентификатор = ВыбранныеПоляЭлементаСтруктуры.ПолучитьИдентификаторПоОбъекту(ЭлементНастройкиПриемник);
				СтрокаПриемник.Картинка = 18;
				СтрокаПриемник.Заголовок = НСтр("ru = 'Авто (поля родителя)'");
			КонецЕсли;
			
		ИначеЕсли НайтиВыбранноеПоле(ВыбранныеПоляЭлементаСтруктуры, ЭлементНастройкиИсточник.Поле) = Неопределено Тогда 
			ЭлементНастройкиПриемник = ВыбранныеПоляЭлементаСтруктуры.Элементы.Добавить(Тип("ВыбранноеПолеКомпоновкиДанных"));
			ЗаполнитьЗначенияСвойств(ЭлементНастройкиПриемник, ЭлементНастройкиИсточник);
			
			ОписаниеНастройки = ВыбранныеПоляЭлементаСтруктуры.ДоступныеПоляВыбора.НайтиПоле(ЭлементНастройкиИсточник.Поле);
			
			СтрокаПриемник = РазделВыбранныхПолей.ПолучитьЭлементы().Добавить();
			ЗаполнитьЗначенияСвойств(СтрокаПриемник, ЭлементНастройкиПриемник);
			ЗаполнитьЗначенияСвойств(СтрокаПриемник, ОписаниеНастройки);
			СтрокаПриемник.Идентификатор = ВыбранныеПоляЭлементаСтруктуры.ПолучитьИдентификаторПоОбъекту(ЭлементНастройкиПриемник);
			СтрокаПриемник.Картинка = ОтчетыКлиентСервер.ИндексКартинки("Элемент");
		КонецЕсли;
		
		СортировкаЭлементаСтруктуры.Элементы.Удалить(ЭлементНастройкиИсточник);
		РазделПолейСортировки.ПолучитьЭлементы().Удалить(СтрокаИсточник);
		
		Индекс = Индекс - 1;
	КонецЦикла;
	
	Элементы.ВыбранныеПоля.Развернуть(РазделВыбранныхПолей.ПолучитьИдентификатор(), Истина);
	УстановитьМодифицированность();
КонецПроцедуры

&НаКлиенте
Функция НайтиВыбранноеПоле(ВыбранныеПоляУзлаНастроек, Поле)
	НайденноеПоле = Неопределено;
	
	Для Каждого ЭлементНастройки Из ВыбранныеПоляУзлаНастроек.Элементы Цикл 
		Если ТипЗнч(ЭлементНастройки) = Тип("ГруппаВыбранныхПолейКомпоновкиДанных") Тогда 
			НайденноеПоле = НайтиВыбранноеПоле(ЭлементНастройки, Поле);
		ИначеЕсли ТипЗнч(ЭлементНастройки) = Тип("ВыбранноеПолеКомпоновкиДанных")
			И ЭлементНастройки.Поле = Поле Тогда 
			НайденноеПоле = Поле;
		КонецЕсли;
	КонецЦикла;
	
	Возврат НайденноеПоле;
КонецФункции

// Сдвиг элементов.

&НаКлиенте
Процедура СдвинутьСортировку(ВНачало = Истина)
	ИдентификаторыСтрок = Элементы.Сортировка.ВыделенныеСтроки;
	ИдентификаторРаздела = Сортировка.ПолучитьЭлементы()[0].ПолучитьИдентификатор();
	
	ИндексРаздела = ИдентификаторыСтрок.Найти(ИдентификаторРаздела);
	Если ИндексРаздела <> Неопределено Тогда 
		ИдентификаторыСтрок.Удалить(ИндексРаздела);
	КонецЕсли;
	
	Если ИдентификаторыСтрок.Количество() = 0 Тогда 
		Возврат;
	КонецЕсли;
	
	СвойствоЭлементаСтруктуры = СвойствоЭлементаСтруктурыНастроек(
		Отчет.КомпоновщикНастроек, "Порядок", ИдентификаторЭлементаСтруктурыНастроек, РасширенныйРежим);
	
	Для Каждого ИдентификаторСтроки Из ИдентификаторыСтрок Цикл 
		Строка = Сортировка.НайтиПоИдентификатору(ИдентификаторСтроки);
		ЭлементНастройки = ЭлементНастройки(СвойствоЭлементаСтруктуры, Строка);
		
		ЭлементыНастроек = СвойствоЭлементаСтруктуры.Элементы;
		Строки = Строка.ПолучитьРодителя().ПолучитьЭлементы();
		
		Индекс = ЭлементыНастроек.Индекс(ЭлементНастройки);
		Граница = ЭлементыНастроек.Количество() - 1;
		
		Если ВНачало Тогда // Сдвиг в начало коллекции.
			Если Индекс = 0 Тогда 
				ЭлементыНастроек.Сдвинуть(ЭлементНастройки, Граница);
				Строки.Сдвинуть(Индекс, Граница);
			Иначе
				ЭлементыНастроек.Сдвинуть(ЭлементНастройки, -1);
				Строки.Сдвинуть(Индекс, -1);
			КонецЕсли;
		Иначе // Сдвиг в конец коллекции.
			Если Индекс = Граница Тогда 
				ЭлементыНастроек.Сдвинуть(ЭлементНастройки, -Граница);
				Строки.Сдвинуть(Индекс, -Граница);
			Иначе
				ЭлементыНастроек.Сдвинуть(ЭлементНастройки, 1);
				Строки.Сдвинуть(Индекс, 1);
			КонецЕсли;
		КонецЕсли;
	КонецЦикла;
	
	УстановитьМодифицированность();
КонецПроцедуры

#КонецОбласти

#Область Оформление

// Чтение настроек.

&НаСервере
Процедура ОбновитьОформление()
	СвойствоЭлементаСтруктуры = СвойствоЭлементаСтруктурыНастроек(
		Отчет.КомпоновщикНастроек, "УсловноеОформление", ИдентификаторЭлементаСтруктурыНастроек);
	
	Если СвойствоЭлементаСтруктуры = Неопределено Тогда 
		Возврат;
	КонецЕсли;
	
	ПрочитатьПредопределенныеПараметрыОформления();
	
	Строки = Оформление.ПолучитьЭлементы();
	
	Для Каждого ЭлементНастройки Из СвойствоЭлементаСтруктуры.Элементы Цикл 
		Строка = Строки.Добавить();
		ЗаполнитьЗначенияСвойств(Строка, ЭлементНастройки);
		Строка.Идентификатор = СвойствоЭлементаСтруктуры.ПолучитьИдентификаторПоОбъекту(ЭлементНастройки);
		Строка.Картинка = -1;
		
		Если ЭлементОформленияПомеченНаУдаление(ЭлементНастройки.Поля) Тогда 
			УстановитьПометкуУдаления("Оформление", Строка);
		КонецЕсли;
		
		Строка.Представление = ОтчетыКлиентСервер.ПредставлениеЭлементаУсловногоОформления(
			ЭлементНастройки, ЭлементНастройки, ?(Строка.ПометкаУдаления, "ПометкаУдаления", ""));
		
		Если ЗначениеЗаполнено(Строка.ПредставлениеПользовательскойНастройки) Тогда 
			Строка.Заголовок = Строка.ПредставлениеПользовательскойНастройки;
		Иначе
			Строка.Заголовок = Строка.Представление;
		КонецЕсли;
		
		Строка.ЭтоПредопределенныйЗаголовок = (Строка.Заголовок = Строка.ПредставлениеПользовательскойНастройки);
		Строка.КартинкаРежимаОтображения = КартинкаРежимаОтображенияЭлементаНастройки(ЭлементНастройки);
	КонецЦикла;
КонецПроцедуры

&НаСервере
Функция ЭлементОформленияПомеченНаУдаление(Поля)
	ДоступныеПоля = Поля.ДоступныеПоляОформляемыхПолей;
	
	Для Каждого Элемент Из Поля.Элементы Цикл 
		Если ДоступныеПоля.НайтиПоле(Элемент.Поле) = Неопределено Тогда 
			Возврат Истина;
		КонецЕсли;
	КонецЦикла;
	
	Возврат Ложь;
КонецФункции

// Определяет свойства параметров вывода, влияющих на отображение заголовка, параметров данных и отборов.
//  См. также ОтчетыСервер.ИнициализироватьПредопределенныеПараметрыВывода().
//
&НаСервере
Процедура ПрочитатьПредопределенныеПараметрыОформления()
	Если РежимИзмененияЭлементаСтруктурыНастроек Тогда 
		Возврат;
	КонецЕсли;
	
	ПредопределенныеПараметры = ПредопределенныеПараметрыВывода(Отчет.КомпоновщикНастроек.Настройки);
	
	// Параметр вывода Заголовок.
	Объект = ПредопределенныеПараметры.TITLE.Объект;
	
	Строка = Оформление.ПолучитьЭлементы().Добавить();
	ЗаполнитьЗначенияСвойств(Строка, Объект, "Использование, Значение");
	Строка.Заголовок = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
		НСтр("ru = 'Выводить заголовок для печати: %1'"),
		?(ЗначениеЗаполнено(Объект.Значение), Объект.Значение, НСтр("ru = '<Отсутствует>'")));
	Строка.Представление = НСтр("ru = 'Выводить заголовок для печати'");
	Строка.Идентификатор = ПредопределенныеПараметры.TITLE.Идентификатор;
	Строка.Картинка = -1;
	Строка.КартинкаРежимаОтображения = 4;
	Строка.ЭтоПараметрВывода = Истина;
	
	// Параметр вывода ВыводитьПараметры.
	Объект = ПредопределенныеПараметры.DATAPARAMETERSOUTPUT.Объект;
	СвязанныйОбъект = ПредопределенныеПараметры.FILTEROUTPUT.Объект;
	
	Строка = Оформление.ПолучитьЭлементы().Добавить();
	Строка.Использование = (Объект.Значение <> ТипВыводаТекстаКомпоновкиДанных.НеВыводить
		Или СвязанныйОбъект.Значение <> ТипВыводаТекстаКомпоновкиДанных.НеВыводить);
	Строка.Заголовок = НСтр("ru = 'Выводить фильтры'");
	Строка.Представление = НСтр("ru = 'Выводить фильтры'");
	Строка.Идентификатор = ПредопределенныеПараметры.DATAPARAMETERSOUTPUT.Идентификатор;
	Строка.Картинка = -1;
	Строка.КартинкаРежимаОтображения = 4;
	Строка.ЭтоПараметрВывода = Истина;
КонецПроцедуры

// Добавление, изменение элементов.

&НаКлиенте
Процедура ОформлениеИзменитьЭлемент(ИдентификаторСтроки = Неопределено, Строка = Неопределено)
	Обработчик = Новый ОписаниеОповещения("ОформлениеИзменитьЭлементЗавершение", ЭтотОбъект, ИдентификаторСтроки);
	
	ПараметрыФормы = Новый Структура;
	ПараметрыФормы.Вставить("НастройкиОтчета", НастройкиОтчета);
	ПараметрыФормы.Вставить("КомпоновщикНастроек", Отчет.КомпоновщикНастроек);
	ПараметрыФормы.Вставить("ИдентификаторЭлементаСтруктурыНастроек", ИдентификаторЭлементаСтруктурыНастроек);
	Если Строка = Неопределено Тогда
		ПараметрыФормы.Вставить("ИдентификаторКД", Неопределено);
		ПараметрыФормы.Вставить("Наименование", "");
	Иначе
		ПараметрыФормы.Вставить("ИдентификаторКД", Строка.Идентификатор);
		ПараметрыФормы.Вставить("Наименование", Строка.Заголовок);
	КонецЕсли;
	ПараметрыФормы.Вставить("Заголовок", СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
		НСтр("ru = 'Элемент условного оформления отчета ""%1""'"), ВариантНаименование));
	
	ОткрытьФорму("ХранилищеНастроек.ХранилищеВариантовОтчетов.Форма.ЭлементУсловногоОформленияОтчета",
		ПараметрыФормы, ЭтотОбъект, УникальныйИдентификатор,,, Обработчик);
КонецПроцедуры

// Параметры:
//  Результат - Структура:
//    * ЭлементКД - ЭлементУсловногоОформления
//    * Наименование - Строка
//  ИдентификаторСтроки - Число
//
&НаКлиенте
Процедура ОформлениеИзменитьЭлементЗавершение(Результат, ИдентификаторСтроки) Экспорт
	Если Результат = Неопределено Или Результат = КодВозвратаДиалога.Отмена Тогда
		Возврат;
	КонецЕсли;
	
	Настройки = Отчет.КомпоновщикНастроек.Настройки;
	
	Если Результат.Свойство("ОписаниеФормул") Тогда 
		ВариантыОтчетовСлужебныйКлиент.ДобавитьФормулы(Настройки, Настройки.ДоступныеПоляВыбора, Результат.ОписаниеФормул);
	КонецЕсли;
	
	СвойствоЭлементаСтруктуры = СвойствоЭлементаСтруктурыНастроек(
		Отчет.КомпоновщикНастроек, "УсловноеОформление", ИдентификаторЭлементаСтруктурыНастроек);
	
	Раздел = КорневаяСтрокаПоУмолчанию("Оформление");
	
	Если ИдентификаторСтроки = Неопределено Тогда
		Если Раздел = Неопределено Тогда 
			Строка = Оформление.ПолучитьЭлементы().Добавить();
		Иначе
			Строка = Раздел.ПолучитьЭлементы().Добавить();
		КонецЕсли;
		ЭлементНастройки = СвойствоЭлементаСтруктуры.Элементы.Добавить();
	Иначе
		Строка = Оформление.НайтиПоИдентификатору(ИдентификаторСтроки);
		ЭлементНастройки = ЭлементНастройки(СвойствоЭлементаСтруктуры, Строка);
		ЭлементНастройки.Отбор.Элементы.Очистить();
		ЭлементНастройки.Поля.Элементы.Очистить();
	КонецЕсли;
	
	ОтчетыКлиентСервер.ЗаполнитьСвойстваРекурсивно(СвойствоЭлементаСтруктуры, ЭлементНастройки, Результат.ЭлементКД);
	ЭлементНастройки.ИдентификаторПользовательскойНастройки = Новый УникальныйИдентификатор;
	
	Если Не ЗначениеЗаполнено(ЭлементНастройки.ПредставлениеПользовательскойНастройки) Тогда 
		ЭлементНастройки.Представление = Результат.Наименование;
	КонецЕсли;
	
	Строка.Идентификатор = СвойствоЭлементаСтруктуры.ПолучитьИдентификаторПоОбъекту(ЭлементНастройки);
	Строка.Использование = ЭлементНастройки.Использование;
	Строка.Заголовок = Результат.Наименование;
	
	Если Не ЗначениеЗаполнено(ЭлементНастройки.ПредставлениеПользовательскойНастройки) Тогда 
		Строка.Представление = Результат.Наименование;
	КонецЕсли;
	
	Строка.ЭтоПредопределенныйЗаголовок = (Строка.Заголовок = Строка.Представление);
	
	Если Строка.ЭтоПредопределенныйЗаголовок Тогда
		ЭлементНастройки.ПредставлениеПользовательскойНастройки = "";
	Иначе
		ЭлементНастройки.ПредставлениеПользовательскойНастройки = Строка.Заголовок;
	КонецЕсли;
	
	Строка.Картинка = -1;
	Строка.КартинкаРежимаОтображения = КартинкаРежимаОтображенияЭлементаНастройки(ЭлементНастройки);
	
	Элементы.Оформление.ТекущаяСтрока = Строка.ПолучитьИдентификатор();
	
	УстановитьМодифицированность();
КонецПроцедуры

&НаКлиенте
Процедура СинхронизироватьПредопределенныеПараметрыВывода(Использование, ЭлементНастройки)
	ПараметрыВывода = Отчет.КомпоновщикНастроек.Настройки.ПараметрыВывода.Элементы;
	
	Значение = ?(Использование, ТипВыводаТекстаКомпоновкиДанных.Авто, ТипВыводаТекстаКомпоновкиДанных.НеВыводить);
	
	Если ЭлементНастройки.Параметр = Новый ПараметрКомпоновкиДанных("Заголовок") Тогда 
		СвязанныйЭлементНастройки = ПараметрыВывода.Найти("TITLEOUTPUT");
		СвязанныйЭлементНастройки.Использование = Истина;
		СвязанныйЭлементНастройки.Значение = Значение;
	ИначеЕсли ЭлементНастройки.Параметр = Новый ПараметрКомпоновкиДанных("ВыводитьПараметрыДанных") Тогда 
		СвязанныйЭлементНастройки = ПараметрыВывода.Найти("FILTEROUTPUT");
		ЗаполнитьЗначенияСвойств(СвязанныйЭлементНастройки, ЭлементНастройки, "Использование, Значение");
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура ОформлениеВводЗаголовкаЗавершение(Значение, Идентификатор) Экспорт 
	Если Значение = Неопределено Тогда 
		Возврат;
	КонецЕсли;
	
	Строка = Оформление.НайтиПоИдентификатору(Идентификатор);
	Строка.Использование = Истина;
	Строка.Значение = Значение;
	Строка.Заголовок = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
		НСтр("ru = 'Выводить заголовок для печати: %1'"),
		?(ЗначениеЗаполнено(Значение), Значение, "<Отсутствует>"));
	
	Настройки = Отчет.КомпоновщикНастроек.Настройки;
	
	ПараметрыВывода = Настройки.ПараметрыВывода;
	ЭлементНастройки = ПараметрыВывода.ПолучитьОбъектПоИдентификатору(Строка.Идентификатор);
	ЭлементНастройки.Значение = Значение;
	ЭлементНастройки.Использование = Истина;
	
	Настройки.ДополнительныеСвойства.Вставить("ЗаголовокУстановленИнтерактивно", ЗначениеЗаполнено(Значение));
	
	УстановитьМодифицированность();
КонецПроцедуры

// Сдвиг элементов.

&НаКлиенте
Процедура СдвинутьОформление(ВНачало = Истина)
	ИдентификаторыСтрок = Элементы.Оформление.ВыделенныеСтроки;
	Строки = Оформление.ПолучитьЭлементы();
	
	ГраницаНачалаЭлементовОформления = 2;
	ГраницаИдентификаторовСтрок = ИдентификаторыСтрок.ВГраница();
	
	Пока ГраницаИдентификаторовСтрок >= 0 Цикл 
		Строка = Оформление.НайтиПоИдентификатору(ИдентификаторыСтрок[ГраницаИдентификаторовСтрок]);
		
		Если Строки.Индекс(Строка) < ГраницаНачалаЭлементовОформления Тогда 
			ИдентификаторыСтрок.Удалить(ГраницаИдентификаторовСтрок);
		КонецЕсли;
		
		ГраницаИдентификаторовСтрок = ГраницаИдентификаторовСтрок - 1;
	КонецЦикла;
	
	Если ИдентификаторыСтрок.Количество() = 0 Тогда 
		Возврат;
	КонецЕсли;
	
	СвойствоЭлементаСтруктуры = СвойствоЭлементаСтруктурыНастроек(
		Отчет.КомпоновщикНастроек, "УсловноеОформление", ИдентификаторЭлементаСтруктурыНастроек);
	
	Для Каждого ИдентификаторСтроки Из ИдентификаторыСтрок Цикл 
		Строка = Оформление.НайтиПоИдентификатору(ИдентификаторСтроки);
		ЭлементНастройки = ЭлементНастройки(СвойствоЭлементаСтруктуры, Строка);
		
		Если ТипЗнч(ЭлементНастройки) <> Тип("ЭлементУсловногоОформленияКомпоновкиДанных") Тогда 
			Продолжить;
		КонецЕсли;
		
		ЭлементыНастроек = СвойствоЭлементаСтруктуры.Элементы;
		
		Индекс = ЭлементыНастроек.Индекс(ЭлементНастройки);
		Граница = ЭлементыНастроек.Количество() - 1;
		
		Если ВНачало Тогда // Сдвиг в начало коллекции.
			Если Индекс = 0 Тогда 
				ЭлементыНастроек.Сдвинуть(ЭлементНастройки, Граница);
				Строки.Сдвинуть(Индекс + ГраницаНачалаЭлементовОформления, Граница);
			Иначе
				ЭлементыНастроек.Сдвинуть(ЭлементНастройки, -1);
				Строки.Сдвинуть(Индекс + ГраницаНачалаЭлементовОформления, -1);
			КонецЕсли;
		Иначе // Сдвиг в конец коллекции.
			Если Индекс = Граница Тогда 
				ЭлементыНастроек.Сдвинуть(ЭлементНастройки, -Граница);
				Строки.Сдвинуть(Индекс + ГраницаНачалаЭлементовОформления, -Граница);
			Иначе
				ЭлементыНастроек.Сдвинуть(ЭлементНастройки, 1);
				Строки.Сдвинуть(Индекс + ГраницаНачалаЭлементовОформления, 1);
			КонецЕсли;
		КонецЕсли;
	КонецЦикла;
	
	УстановитьМодифицированность();
КонецПроцедуры

// Использование элементов.

&НаКлиенте
Процедура ИзменитьИспользованиеПредопределенныхПараметровВывода(Использование = Истина)
	Если РежимИзмененияЭлементаСтруктурыНастроек Тогда 
		Возврат;
	КонецЕсли;
	
	Строки = Оформление.ПолучитьЭлементы();
	СвойствоЭлементаСтруктуры = Отчет.КомпоновщикНастроек.Настройки.ПараметрыВывода;
	
	Для Каждого Строка Из Строки Цикл 
		Если ТипЗнч(Строка.Идентификатор) <> Тип("ИдентификаторКомпоновкиДанных") Тогда 
			Продолжить;
		КонецЕсли;
		
		Строка.Использование = Использование;
		ЭлементНастройки = ЭлементНастройки(СвойствоЭлементаСтруктуры, Строка);
		ЭлементНастройки.Использование = Использование;
	КонецЦикла;
КонецПроцедуры

// Обработчик закрытия общей формы НастройкаКолонтитулов.
//  См. Синтакс-помощник: ОткрытьФорму - ОписаниеОповещенияОЗакрытии.
//
&НаКлиенте
Процедура ЗапомнитьНастройкиКолонтитулов(Настройки, ДополнительныеПараметры) Экспорт 
	ПредыдущиеНастройки = Неопределено;
	Отчет.КомпоновщикНастроек.Настройки.ДополнительныеСвойства.Свойство("НастройкиКолонтитулов", ПредыдущиеНастройки);
	
	Если Настройки <> ПредыдущиеНастройки Тогда 
		УстановитьМодифицированность();
	КонецЕсли;
	
	Отчет.КомпоновщикНастроек.Настройки.ДополнительныеСвойства.Вставить("НастройкиКолонтитулов", Настройки);
КонецПроцедуры

#КонецОбласти

#Область Структура

// Чтение настроек.

&НаСервере
Процедура ОбновитьСтруктуру()
	СвойствоЭлементаСтруктуры = СвойствоЭлементаСтруктурыНастроек(Отчет.КомпоновщикНастроек, "Структура");
	Если СвойствоЭлементаСтруктуры = Неопределено Тогда 
		Возврат;
	КонецЕсли;
	
	Раздел = СтруктураВарианта.ПолучитьЭлементы().Добавить();
	Раздел.Представление = НСтр("ru = 'Отчет'");
	Раздел.ЭтоРаздел = Истина;
	Раздел.Картинка = -1;
	Раздел.Тип = СвойствоЭлементаСтруктуры;
	Строки = Раздел.ПолучитьЭлементы();
	
	ОбновитьКоллекциюСтруктуры(СвойствоЭлементаСтруктуры, "Структура", Строки);
КонецПроцедуры

&НаСервере
Процедура ОбновитьКоллекциюСтруктуры(Знач Узел, Знач ИмяКоллекции, Строки)
	СвойствоЭлементаСтруктуры = СвойствоЭлементаСтруктурыНастроек(Отчет.КомпоновщикНастроек, "Структура");
	ПользовательскиеНастройки = Отчет.КомпоновщикНастроек.ПользовательскиеНастройки.Элементы;
	
	Коллекция = Узел[ИмяКоллекции];
	ТипКоллекции = ТипЗнч(Коллекция);
	ИменаКоллекций = ИменаКоллекцийЭлементаСтруктуры(Коллекция);
	
	Если ТипКоллекции = Тип("КоллекцияЭлементовСтруктурыНастроекКомпоновкиДанных") Тогда 
		
		Если ЗначениеЗаполнено(Коллекция.ИдентификаторПользовательскойНастройки) Тогда 
			СодержитПользовательскиеЭлементыСтруктуры = Истина;
		КонецЕсли;
		
	ИначеЕсли ИменаКоллекций.Найти(ИмяКоллекции) <> Неопределено
		И (ТипКоллекции = Тип("КоллекцияЭлементовСтруктурыТаблицыКомпоновкиДанных")
			Или ТипКоллекции = Тип("КоллекцияЭлементовСтруктурыДиаграммыКомпоновкиДанных")) Тогда 
		
		Строка = Строки.Добавить();
		Строка.Идентификатор = СвойствоЭлементаСтруктуры.ПолучитьИдентификаторПоОбъекту(Коллекция);
		
		Строка.Представление = ПредставлениеКоллекцииЭлементаСтруктуры(ИмяКоллекции);
		Если ЗначениеЗаполнено(Коллекция.ПредставлениеПользовательскойНастройки) Тогда 
			Строка.Представление = Коллекция.ПредставлениеПользовательскойНастройки;
		КонецЕсли;
		
		Строка.Картинка = -1;
		Строка.Тип = Коллекция;
		Строка.Подтип = ?(СтрНайти("Серии, Точки", ИмяКоллекции) > 0, "Диаграмма", "Таблица") + ИмяКоллекции;
		Строки = Строка.ПолучитьЭлементы();
	КонецЕсли;
	
	Для Каждого Элемент Из Коллекция Цикл 
		Если ЗначениеЗаполнено(Элемент.ИдентификаторПользовательскойНастройки) Тогда 
			СодержитПользовательскиеЭлементыСтруктуры = Истина;
		КонецЕсли;
		
		ЭлементПользовательскойНастройки = ПользовательскиеНастройки.Найти(Элемент.ИдентификаторПользовательскойНастройки);
		
		Строка = Строки.Добавить();
		
		Если ЭлементПользовательскойНастройки = Неопределено Тогда 
			Строка.Использование = Элемент.Использование;
		Иначе
			Строка.Использование = ЭлементПользовательскойНастройки.Использование;
		КонецЕсли;
		
		Если ТипЗнч(Элемент) = Тип("НастройкиВложенногоОбъектаКомпоновкиДанных") Тогда 
			Узел = Элемент.Настройки;
			СодержитВложенныеОтчеты = Истина;
		Иначе
			Узел = Элемент;
			ЗаполнитьЗначенияСвойств(Строка, Элемент);
			
			Если РасширенныйРежим = 0 И ЭлементПользовательскойНастройки <> Неопределено Тогда 
				Строка.Использование = ЭлементПользовательскойНастройки.Использование;
			КонецЕсли;
		КонецЕсли;
		
		Строка.Идентификатор = СвойствоЭлементаСтруктуры.ПолучитьИдентификаторПоОбъекту(Узел);
		Строка.ФлажокДоступен = (РасширенныйРежим = 1 Или ЭлементПользовательскойНастройки <> Неопределено);
		
		СвойстваЭлемента = СвойстваЭлементаКоллекцииСтруктуры(Элемент);
		ЗаполнитьЗначенияСвойств(Строка, СвойстваЭлемента);
		
		Строка.Подтип = Строка.ПолучитьРодителя().Подтип;
		
		Если СвойстваЭлемента.ПометкаУдаления Тогда 
			УстановитьПометкуУдаления("СтруктураВарианта", Строка);
		КонецЕсли;
		
		Для Каждого ИмяКоллекции Из СвойстваЭлемента.ИменаКоллекций Цикл 
			ОбновитьКоллекциюСтруктуры(Узел, ИмяКоллекции, Строка.ПолучитьЭлементы());
		КонецЦикла;
	КонецЦикла;
КонецПроцедуры

// Параметры:
//  Элемент - НастройкиВложенногоОбъектаКомпоновкиДанных
//
// Возвращаемое значение:
//  Структура:
//    * СодержитУсловноеОформление - Булево
//    * СодержитПоляИлиСортировки - Булево
//    * СодержитОтборы - Булево
//    * Тип - Строка
//    * Картинка - Число
//    * ПометкаУдаления - Булево
//    * ИменаКоллекций - Массив
//    * Заголовок - Строка
//    * Представление - Строка
//
&НаСервере
Функция СвойстваЭлементаКоллекцииСтруктуры(Элемент)
	СвойстваЭлемента = ПалитраСвойствЭлементаКоллекцииСтруктуры();
	
	ТипЭлемента = ТипЗнч(Элемент);
	Если ТипЭлемента = Тип("ГруппировкаКомпоновкиДанных")
		Или ТипЭлемента = Тип("ГруппировкаТаблицыКомпоновкиДанных")
		Или ТипЭлемента = Тип("ГруппировкаДиаграммыКомпоновкиДанных") Тогда 
		
		СвойстваЭлемента.Представление = ВариантыОтчетовСлужебный.ПредставлениеПолейГруппировки(
			Элемент, СвойстваЭлемента.ПометкаУдаления);
		
	ИначеЕсли ТипЭлемента = Тип("НастройкиВложенногоОбъектаКомпоновкиДанных") Тогда 
		
		Объекты = ДоступныеОбъектыНастройки(Элемент);
		ОписаниеОбъекта = Объекты.Найти(Элемент.ИдентификаторОбъекта);
		
		СвойстваЭлемента.Представление = ОписаниеОбъекта.Заголовок;
		Если ЗначениеЗаполнено(Элемент.ПредставлениеПользовательскойНастройки) Тогда 
			СвойстваЭлемента.Представление = Элемент.ПредставлениеПользовательскойНастройки;
		КонецЕсли;
		
		Если Не ЗначениеЗаполнено(СвойстваЭлемента.Представление) Тогда
			СвойстваЭлемента.Представление = НСтр("ru = 'Вложенная группировка'");
		КонецЕсли;
		
	ИначеЕсли ТипЭлемента = Тип("ТаблицаКомпоновкиДанных") Тогда 
		
		СвойстваЭлемента.Представление = НСтр("ru = 'Таблица'");
		Если ЗначениеЗаполнено(Элемент.ПредставлениеПользовательскойНастройки) Тогда 
			СвойстваЭлемента.Представление = Элемент.ПредставлениеПользовательскойНастройки;
		КонецЕсли;
		
	ИначеЕсли ТипЭлемента = Тип("ДиаграммаКомпоновкиДанных") Тогда 
		
		СвойстваЭлемента.Представление = НСтр("ru = 'Диаграмма'");
		Если ЗначениеЗаполнено(Элемент.ПредставлениеПользовательскойНастройки) Тогда 
			СвойстваЭлемента.Представление = Элемент.ПредставлениеПользовательскойНастройки;
		КонецЕсли;
		
	Иначе
		СвойстваЭлемента.Представление = Строка(ТипЭлемента);
	КонецЕсли;
	
	Если ТипЭлемента <> Тип("НастройкиВложенногоОбъектаКомпоновкиДанных") Тогда 
		
		ПараметрыВывода = Элемент.ПараметрыВывода; // ЗначенияПараметровВыводаКомпоновкиДанных 
		ЗаголовокЭлемента = ПараметрыВывода.Элементы.Найти("Заголовок");
		
		Если ЗаголовокЭлемента <> Неопределено Тогда 
			СвойстваЭлемента.Заголовок = ЗаголовокЭлемента.Значение;
		КонецЕсли;
		
	КонецЕсли;
	
	СвойстваЭлемента.ИменаКоллекций = ИменаКоллекцийЭлементаСтруктуры(Элемент);
	
	ПредставлениеТипаЭлемента = ОтчетыКлиентСервер.ТипНастройкиСтрокой(ТипЭлемента);
	СостояниеЭлемента = ?(СвойстваЭлемента.ПометкаУдаления, "ПометкаУдаления", Неопределено);
	СвойстваЭлемента.Картинка = ОтчетыКлиентСервер.ИндексКартинки(ПредставлениеТипаЭлемента, СостояниеЭлемента);
	
	СвойстваЭлемента.Тип = Элемент;
	
	УстановитьПризнакиВложенныхЭлементовНастроек(Элемент, СвойстваЭлемента);
	
	Возврат СвойстваЭлемента;
КонецФункции

&НаСервере
Функция ПалитраСвойствЭлементаКоллекцииСтруктуры()
	СвойстваЭлемента = Новый Структура;
	СвойстваЭлемента.Вставить("Представление", "");
	СвойстваЭлемента.Вставить("Заголовок", "");
	СвойстваЭлемента.Вставить("ИменаКоллекций", Новый Массив);
	СвойстваЭлемента.Вставить("ПометкаУдаления", Ложь);
	СвойстваЭлемента.Вставить("Картинка", -1);
	СвойстваЭлемента.Вставить("Тип", "");
	СвойстваЭлемента.Вставить("СодержитОтборы", Ложь);
	СвойстваЭлемента.Вставить("СодержитПоляИлиСортировки", Ложь);
	СвойстваЭлемента.Вставить("СодержитУсловноеОформление", Ложь);
	
	Возврат СвойстваЭлемента;
КонецФункции

&НаСервере
Функция ДоступныеОбъектыНастройки(НастройкиВложенногоОбъекта)
	Если ТипЗнч(НастройкиВложенногоОбъекта.Родитель) = Тип("НастройкиКомпоновкиДанных") Тогда 
		Возврат НастройкиВложенногоОбъекта.Родитель.ДоступныеОбъекты.Элементы;
	Иначе
		Возврат ДоступныеОбъектыНастройки(НастройкиВложенногоОбъекта.Родитель);
	КонецЕсли;
КонецФункции

&НаСервере
Процедура УстановитьПризнакиВложенныхЭлементовНастроек(ЭлементСтруктуры, СвойстваЭлементаСтруктуры)
	ТипЭлемента = ТипЗнч(ЭлементСтруктуры);
	Если ТипЭлемента = Тип("ТаблицаКомпоновкиДанных")
		Или ТипЭлемента = Тип("ДиаграммаКомпоновкиДанных") Тогда 
		Возврат;
	КонецЕсли;
	
	Элемент = ЭлементСтруктуры;
	Если ТипЭлемента = Тип("НастройкиВложенногоОбъектаКомпоновкиДанных") Тогда 
		Элемент = ЭлементСтруктуры.Настройки;
	КонецЕсли;
	
	СвойстваЭлементаСтруктуры.СодержитОтборы = Элемент.Отбор.Элементы.Количество();
	СвойстваЭлементаСтруктуры.СодержитУсловноеОформление = Элемент.УсловноеОформление.Элементы.Количество();
	
	ВложенныеЭлементы = Элемент.Выбор.Элементы;
	СодержитПоля = ВложенныеЭлементы.Количество() > 0
		И Не (ВложенныеЭлементы.Количество() = 1
		И ТипЗнч(ВложенныеЭлементы[0]) = Тип("АвтоВыбранноеПолеКомпоновкиДанных"));
	
	ВложенныеЭлементы = Элемент.Порядок.Элементы;
	СодержитСортировки = ВложенныеЭлементы.Количество() > 0
		И Не (ВложенныеЭлементы.Количество() = 1
		И ТипЗнч(ВложенныеЭлементы[0]) = Тип("АвтоЭлементПорядкаКомпоновкиДанных"));
	
	СвойстваЭлементаСтруктуры.СодержитПоляИлиСортировки = СодержитПоля Или СодержитСортировки;
	
	// Установка служебных признаков.
	Если СвойстваЭлементаСтруктуры.СодержитОтборы Тогда 
		СодержитВложенныеОтборы = Истина;
	КонецЕсли;
	
	Если СвойстваЭлементаСтруктуры.СодержитПоляИлиСортировки Тогда 
		СодержитВложенныеПоляИлиСортировки = Истина;
	КонецЕсли;
	
	Если СвойстваЭлементаСтруктуры.СодержитУсловноеОформление Тогда 
		СодержитВложенноеУсловноеОформление = Истина;
	КонецЕсли;
КонецПроцедуры

// Добавление, изменение элементов.

&НаКлиенте
Процедура ДобавитьГруппировкуСтруктурыВарианта(СледующийУровень = Истина)
	ПараметрыВыполнения = Новый Структура;
	ПараметрыВыполнения.Вставить("СледующийУровень", СледующийУровень);
	ПараметрыВыполнения.Вставить("Оборачивать", Истина);
	
	ИдентификаторЭлементаСтруктуры = Неопределено;
	Строка = Элементы.СтруктураВарианта.ТекущиеДанные;
	Если Строка = Неопределено Тогда
		Строка = КорневаяСтрокаПоУмолчанию("СтруктураВарианта");
	КонецЕсли;
			
	Если Строка <> Неопределено Тогда
		Если Не СледующийУровень Тогда
			Строка = Строка.ПолучитьРодителя();
		КонецЕсли;
		
		Если СледующийУровень Тогда
			Если (Строка.Тип = "НастройкиКомпоновкиДанных" И Не Строка.ФлажокДоступен) 
				Или Строка.ПолучитьЭлементы().Количество() > 1 
				Или (Строка.Тип = "КоллекцияЭлементовСтруктурыТаблицыКомпоновкиДанных"
					И Строка.Подтип = "ТаблицаКолонки") Тогда 
				ПараметрыВыполнения.Оборачивать = Ложь;
			КонецЕсли;
		КонецЕсли;
		
		Пока Строка <> Неопределено Цикл
			Если Строка.Тип = "НастройкиКомпоновкиДанных"
				Или Строка.Тип = "НастройкиВложенногоОбъектаКомпоновкиДанных"
				Или Строка.Тип = "ГруппировкаКомпоновкиДанных"
				Или Строка.Тип = "ГруппировкаТаблицыКомпоновкиДанных"
				Или Строка.Тип = "ГруппировкаДиаграммыКомпоновкиДанных" Тогда
				ИдентификаторЭлементаСтруктуры = Строка.Идентификатор;
				Прервать;
			КонецЕсли;
			Строка = Строка.ПолучитьРодителя();
		КонецЦикла;
	КонецЕсли;
	
	Обработчик = Новый ОписаниеОповещения("СтруктураВариантаПослеВыбораПоля", ЭтотОбъект, ПараметрыВыполнения);
	ВыбратьПоле("СтруктураВарианта", Обработчик, Неопределено, ИдентификаторЭлементаСтруктуры);
КонецПроцедуры

&НаКлиенте
Процедура ДобавитьЭлементСтруктурыНастроек(ТипЭлемента)
	ТекущаяСтрока = Элементы.СтруктураВарианта.ТекущиеДанные;
	
	Результат = ВставитьЭлементСтруктурыНастроек(ТипЭлемента, ТекущаяСтрока, Истина);
	ЭлементНастройки = Результат.ЭлементНастройки;
	
	Строка = Результат.Строка;
	Строка.Тип = ЭлементНастройки;
	Строка.Заголовок = Строка.Представление;
	Строка.ФлажокДоступен = Истина;
	Строка.Использование = ЭлементНастройки.Использование;
	
	ПредставлениеТипаЭлемента = ОтчетыКлиентСервер.ТипНастройкиСтрокой(ТипЗнч(ЭлементНастройки));
	Строка.Картинка = ОтчетыКлиентСервер.ИндексКартинки(ПредставлениеТипаЭлемента);
	
	СвойствоЭлементаСтруктуры = СвойствоЭлементаСтруктурыНастроек(Отчет.КомпоновщикНастроек, "Структура");
	ПодчиненныеСтроки = Строка.ПолучитьЭлементы();
	
	Если Строка.Тип = "ДиаграммаКомпоновкиДанных" Тогда
		ЭлементНастройки.Выбор.Элементы.Добавить(Тип("АвтоВыбранноеПолеКомпоновкиДанных"));
		УстановитьПараметрВывода(ЭлементНастройки, "ТипДиаграммы.СоединениеЗначенийПоСериям", ТипСоединенияЗначенийПоСериямДиаграммы.СоединениеКраев);
		УстановитьПараметрВывода(ЭлементНастройки, "ТипДиаграммы.ЛинииСоединенияЗначенийПоСериям");
		УстановитьПараметрВывода(ЭлементНастройки, "ТипДиаграммы.ЦветСоединенияЗначенийПоСериям", WebЦвета.СеребристоСерый);
		УстановитьПараметрВывода(ЭлементНастройки, "ТипДиаграммы.РежимСглаживания", РежимСглаживанияДиаграммы.ГладкаяКривая);
		УстановитьПараметрВывода(ЭлементНастройки, "ТипДиаграммы.РежимПолупрозрачности", РежимПолупрозрачностиДиаграммы.Использовать);
		
		Строка.Представление = НСтр("ru = 'Диаграмма'");
		
		ПодчиненныйЭлементНастройки = ЭлементНастройки.Точки;
		ПодчиненнаяСтрока = ПодчиненныеСтроки.Добавить(); // см. ЭлементКоллекцииФормыНастроек
		ПодчиненнаяСтрока.Тип = ПодчиненныйЭлементНастройки;
		ПодчиненнаяСтрока.Подтип = "ДиаграммаТочки";
		ПодчиненнаяСтрока.Идентификатор = СвойствоЭлементаСтруктуры.ПолучитьИдентификаторПоОбъекту(ПодчиненныйЭлементНастройки);
		ПодчиненнаяСтрока.Картинка = -1;
		ПодчиненнаяСтрока.Представление = НСтр("ru = 'Точки'");
		
		ПодчиненныйЭлементНастройки = ЭлементНастройки.Серии;
		ПодчиненнаяСтрока = ПодчиненныеСтроки.Добавить(); // см. ЭлементКоллекцииФормыНастроек
		ПодчиненнаяСтрока.Тип = ПодчиненныйЭлементНастройки;
		ПодчиненнаяСтрока.Подтип = "ДиаграммаСерии";
		ПодчиненнаяСтрока.Идентификатор = СвойствоЭлементаСтруктуры.ПолучитьИдентификаторПоОбъекту(ПодчиненныйЭлементНастройки);
		ПодчиненнаяСтрока.Картинка = -1;
		ПодчиненнаяСтрока.Представление = НСтр("ru = 'Серии'");
	ИначеЕсли Строка.Тип = "ТаблицаКомпоновкиДанных" Тогда
		Строка.Представление = НСтр("ru = 'Таблица'");
		
		ПодчиненныйЭлементНастройки = ЭлементНастройки.Строки;
		ПодчиненнаяСтрока = ПодчиненныеСтроки.Добавить(); // см. ЭлементКоллекцииФормыНастроек
		ПодчиненнаяСтрока.Тип = ПодчиненныйЭлементНастройки;
		ПодчиненнаяСтрока.Подтип = "ТаблицаСтроки";
		ПодчиненнаяСтрока.Идентификатор = СвойствоЭлементаСтруктуры.ПолучитьИдентификаторПоОбъекту(ПодчиненныйЭлементНастройки);
		ПодчиненнаяСтрока.Картинка = -1;
		ПодчиненнаяСтрока.Представление = НСтр("ru = 'Строки'");
		
		ПодчиненныйЭлементНастройки = ЭлементНастройки.Колонки;
		ПодчиненнаяСтрока = ПодчиненныеСтроки.Добавить(); // см. ЭлементКоллекцииФормыНастроек
		ПодчиненнаяСтрока.Тип = ПодчиненныйЭлементНастройки;
		ПодчиненнаяСтрока.Подтип = "ТаблицаКолонки";
		ПодчиненнаяСтрока.Идентификатор = СвойствоЭлементаСтруктуры.ПолучитьИдентификаторПоОбъекту(ПодчиненныйЭлементНастройки);
		ПодчиненнаяСтрока.Картинка = -1;
		ПодчиненнаяСтрока.Представление = НСтр("ru = 'Колонки'");
	КонецЕсли;
	
	Элементы.СтруктураВарианта.Развернуть(Строка.ПолучитьИдентификатор(), Истина);
	УстановитьМодифицированность();
КонецПроцедуры

&НаКлиенте
Процедура СтруктураВариантаПослеВыбораПоля(ОписаниеНастройки, ПараметрыВыполнения) Экспорт
	Если ОписаниеНастройки = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	Настройки = Отчет.КомпоновщикНастроек.Настройки;
	ВариантыОтчетовСлужебныйКлиент.ДобавитьФормулу(Настройки, Настройки.ДоступныеПоляГруппировок, ОписаниеНастройки);
	
	ТекущаяСтрока = Элементы.СтруктураВарианта.ТекущиеДанные;
	
	СтрокиПеремещаемыеВНовуюГруппировку = Новый Массив;
	Если ПараметрыВыполнения.Оборачивать Тогда
		Если ПараметрыВыполнения.СледующийУровень Тогда
			Найденные = ТекущаяСтрока.ПолучитьЭлементы();
			Для Каждого ПеремещаемаяСтрока Из Найденные Цикл
				СтрокиПеремещаемыеВНовуюГруппировку.Добавить(ПеремещаемаяСтрока);
			КонецЦикла;
		Иначе
			СтрокиПеремещаемыеВНовуюГруппировку.Добавить(ТекущаяСтрока);
		КонецЕсли;
	КонецЕсли;
	
	// Добавление новой группировки.
	Результат = ВставитьЭлементСтруктурыНастроек(Тип("ГруппировкаКомпоновкиДанных"), ТекущаяСтрока, ПараметрыВыполнения.СледующийУровень);
	
	ЭлементНастройки = Результат.ЭлементНастройки;
	ЭлементНастройки.Использование = Истина;
	ЭлементНастройки.Выбор.Элементы.Добавить(Тип("АвтоВыбранноеПолеКомпоновкиДанных"));
	ЭлементНастройки.Порядок.Элементы.Добавить(Тип("АвтоЭлементПорядкаКомпоновкиДанных"));
	
	Если ОписаниеНастройки = "<>" Тогда
		// Детальные записи - добавлять поле не требуется.
		Представление = НСтр("ru = '<Детальные записи>'");
	Иначе
		ПолеГруппировки = ЭлементНастройки.ПоляГруппировки.Элементы.Добавить(Тип("ПолеГруппировкиКомпоновкиДанных"));
		ПолеГруппировки.Использование = Истина;
		ПолеГруппировки.Поле = ОписаниеНастройки.Поле;
		Представление = ОписаниеНастройки.Заголовок;
	КонецЕсли;
	
	Строка = Результат.Строка;
	Строка.Использование = ЭлементНастройки.Использование;
	Строка.Представление = Представление;
	Строка.ФлажокДоступен = Истина;
	Строка.Тип = ЭлементНастройки;
	
	ТипЭлемента = Тип(Строка.Тип);
	ПредставлениеТипаЭлемента = ОтчетыКлиентСервер.ТипНастройкиСтрокой(ТипЭлемента);
	СостояниеЭлемента = ?(Строка.ПометкаУдаления, "ПометкаУдаления", Неопределено);
	Строка.Картинка = ОтчетыКлиентСервер.ИндексКартинки(ПредставлениеТипаЭлемента, СостояниеЭлемента);
	
	Если Не ПараметрыВыполнения.СледующийУровень Тогда
		Строка.Заголовок = ТекущаяСтрока.Заголовок;
		ОбновитьЗаголовокЭлементаСтруктурыВарианта(Строка);
		ТекущаяСтрока.Заголовок = "";
		ОбновитьЗаголовокЭлементаСтруктурыВарианта(ТекущаяСтрока);
	КонецЕсли;
	
	// Перемещение текущей группировки в новую.
	Для Каждого ПеремещаемаяСтрока Из СтрокиПеремещаемыеВНовуюГруппировку Цикл
		Результат = ПереместитьЭлементыСтруктурыВарианта(ПеремещаемаяСтрока, Строка);
	КонецЦикла;
	
	Элементы.СтруктураВарианта.Развернуть(Строка.ПолучитьИдентификатор(), Истина);
	Элементы.СтруктураВарианта.ТекущаяСтрока = Строка.ПолучитьИдентификатор();
	
	УстановитьМодифицированность();
КонецПроцедуры

// Параметры:
//  ТипЭлемента - Тип
//  Строка - см. ЭлементКоллекцииФормыНастроек
//  СледующийУровень - Булево
//
// Возвращаемое значение:
//  Структура:
//    * Строка - см. ЭлементКоллекцииФормыНастроек
//    * СвойствоЭлементаСтруктуры - см. СвойствоЭлементаСтруктурыНастроек
//    * ЭлементНастройки - см. ЭлементНастройки
//
&НаКлиенте
Функция ВставитьЭлементСтруктурыНастроек(ТипЭлемента, Строка, СледующийУровень)
	СвойствоЭлементаСтруктуры = СвойствоЭлементаСтруктурыНастроек(Отчет.КомпоновщикНастроек, "Структура");
	
	Если Строка = Неопределено Тогда
		Строка = КорневаяСтрокаПоУмолчанию("СтруктураВарианта");
	КонецЕсли;
	
	Родитель = ПолучитьРодителя("СтруктураВарианта", Строка);
	Если Не ЗначениеЗаполнено(Строка.Подтип) Тогда 
		Строка.Подтип = Родитель.Подтип;
	КонецЕсли;
	
	ЭлементНастройки = ЭлементНастройки(СвойствоЭлементаСтруктуры, Строка);
	ИмяКоллекции = ?(ЗначениеЗаполнено(Строка.Подтип), Строка.Подтип, Неопределено);
	
	Если СледующийУровень Тогда
		Строки = Строка.ПолучитьЭлементы();
		Индекс = Неопределено;
		
		ЭлементыНастроек = ЭлементыНастроек(СвойствоЭлементаСтруктуры, ЭлементНастройки, ИмяКоллекции);
		ИндексЭлементаНастройки = Неопределено
	Иначе // Вставка на один уровень со строкой.
		Родитель = ПолучитьРодителя("СтруктураВарианта", Строка);
		Строки = Родитель.ПолучитьЭлементы();
		Индекс = Строки.Индекс(Строка) + 1;
		
		РодительЭлементаНастройки = ПолучитьРодителяЭлементаНастройки(СвойствоЭлементаСтруктуры, ЭлементНастройки);
		ЭлементыНастроек = ЭлементыНастроек(СвойствоЭлементаСтруктуры, РодительЭлементаНастройки, ИмяКоллекции);
		ИндексЭлементаНастройки = ЭлементыНастроек.Индекс(ЭлементНастройки) + 1;
	КонецЕсли;
	
	Если Индекс = Неопределено Тогда
		НоваяСтрока = Строки.Добавить();
	Иначе
		НоваяСтрока = Строки.Вставить(Индекс);
	КонецЕсли;
	
	Если ОтчетыКлиент.ПриДобавленииВКоллекциюНужноУказыватьТипЭлемента(ТипЗнч(ЭлементыНастроек)) Тогда
		Если ИндексЭлементаНастройки = Неопределено Тогда
			НовыйЭлементНастройки = ЭлементыНастроек.Добавить(ТипЭлемента);
		Иначе
			НовыйЭлементНастройки = ЭлементыНастроек.Вставить(ИндексЭлементаНастройки, ТипЭлемента);
		КонецЕсли;
	Иначе
		Если ИндексЭлементаНастройки = Неопределено Тогда
			НовыйЭлементНастройки = ЭлементыНастроек.Добавить();
		Иначе
			НовыйЭлементНастройки = ЭлементыНастроек.Вставить(ИндексЭлементаНастройки);
		КонецЕсли;
	КонецЕсли;
	Элементы.СтруктураВарианта.ТекущаяСтрока = НоваяСтрока.ПолучитьИдентификатор();
	НоваяСтрока.Идентификатор = СвойствоЭлементаСтруктуры.ПолучитьИдентификаторПоОбъекту(НовыйЭлементНастройки);
	
	Результат = Новый Структура("Строка, СвойствоЭлементаСтруктуры, ЭлементНастройки");
	Результат.Строка = НоваяСтрока;
	Результат.СвойствоЭлементаСтруктуры = СвойствоЭлементаСтруктуры;
	Результат.ЭлементНастройки = НовыйЭлементНастройки;
	
	Возврат Результат;
КонецФункции

&НаКлиенте
Функция ПереместитьЭлементыСтруктурыВарианта(Знач Строка, Знач НовыйРодитель,
	Знач ПередЧемВставить = Неопределено, Знач Индекс = Неопределено, Знач ИндексЭлементаНастройки = Неопределено)
	
	Результат = Новый Структура("Строка, ЭлементНастройки, Индекс, ИндексЭлементаНастройки");
	
	ДобавлятьВКонец = (НовыйРодитель = Неопределено);
	КудаВставить = ПолучитьЭлементы(СтруктураВарианта, НовыйРодитель);
	
	УзелКД = СвойствоЭлементаСтруктурыНастроек(Отчет.КомпоновщикНастроек, "Структура");
	
	ЭлементКД = ЭлементНастройки(УзелКД, Строка);
	НовыйРодительКД = ЭлементНастройки(УзелКД, НовыйРодитель);
	КудаВставитьКД = ЭлементыНастроек(УзелКД, НовыйРодительКД);
	ПередЧемВставитьКД = ЭлементНастройки(УзелКД, ПередЧемВставить);
	
	СтарыйРодитель = ПолучитьРодителя("СтруктураВарианта", Строка);
	ОткудаПереместить = ПолучитьЭлементы(СтруктураВарианта, СтарыйРодитель);
	
	СтарыйРодительКД = ЭлементНастройки(УзелКД, СтарыйРодитель);
	ОткудаПереместитьКД = ЭлементыНастроек(УзелКД, СтарыйРодительКД);
	
	Если ЭлементКД = ПередЧемВставитьКД Тогда
		Результат.ЭлементНастройки = ЭлементКД;
		Результат.Строка = Строка;
	Иначе
		Если Индекс = Неопределено Или ИндексЭлементаНастройки = Неопределено Тогда
			Если ПередЧемВставитьКД = Неопределено Тогда
				Если ДобавлятьВКонец Тогда
					Индекс = КудаВставить.Количество();
					ИндексЭлементаНастройки = КудаВставитьКД.Количество();
				Иначе
					Индекс = 0;
					ИндексЭлементаНастройки = 0;
				КонецЕсли;
			Иначе
				Индекс = КудаВставить.Индекс(ПередЧемВставить);
				ИндексЭлементаНастройки = КудаВставитьКД.Индекс(ПередЧемВставитьКД);
				Если СтарыйРодитель = НовыйРодитель Тогда
					СтарыйИндекс = ОткудаПереместить.Индекс(Строка);
					Если СтарыйИндекс <= Индекс Тогда
						Индекс = Индекс + 1;
						ИндексЭлементаНастройки = ИндексЭлементаНастройки + 1;
					КонецЕсли;
				КонецЕсли;
			КонецЕсли;
		КонецЕсли;
		
		ПоискЭлементовКД = Новый Соответствие;
		Результат.ЭлементНастройки = ОтчетыКлиентСервер.СкопироватьРекурсивно(УзелКД, ЭлементКД, КудаВставитьКД, ИндексЭлементаНастройки, ПоискЭлементовКД);
		
		ПоискСтрокТаблицы = Новый Соответствие;
		Результат.Строка = ОтчетыКлиентСервер.СкопироватьРекурсивно(Неопределено, Строка, КудаВставить, Индекс, ПоискСтрокТаблицы);
		
		Для Каждого КлючИЗначение Из ПоискСтрокТаблицы Цикл
			СтараяСтрока = КлючИЗначение.Ключ; // см. ЭлементКоллекцииФормыНастроек
			НоваяСтрока = КлючИЗначение.Значение; // см. ЭлементКоллекцииФормыНастроек
			НоваяСтрока.Идентификатор = ПоискЭлементовКД.Получить(СтараяСтрока.Идентификатор);
		КонецЦикла;
		
		ОткудаПереместить.Удалить(Строка);
		ОткудаПереместитьКД.Удалить(ЭлементКД);
	КонецЕсли;
	
	Результат.Индекс = КудаВставить.Индекс(Результат.Строка);
	Результат.ИндексЭлементаНастройки = КудаВставитьКД.Индекс(Результат.ЭлементНастройки);
	
	Возврат Результат;
КонецФункции

&НаКлиенте
Процедура СтруктураВариантаПриИзмененииТекущейСтроки()
	Строка = Элементы.СтруктураВарианта.ТекущиеДанные;
	Элементы.КомандыСтруктурыВарианта_Добавление.Доступность = Строка <> Неопределено;
	Элементы.КомандыСтруктурыВарианта_Добавление1.Доступность = Элементы.КомандыСтруктурыВарианта_Добавление.Доступность;
	Если Строка <> Неопределено Тогда
		УстановитьДоступностьКомандСтруктурыВарианта(Строка.ПолучитьИдентификатор());
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура УстановитьДоступностьКомандСтруктурыВарианта(ИдентификаторСтроки)
	Строка = СтруктураВарианта.НайтиПоИдентификатору(ИдентификаторСтроки);
	Родитель = Строка.ПолучитьРодителя();
	ЕстьРодитель = (Родитель <> Неопределено);
	ЕстьПотенциальныеРодители = ЕстьРодитель И ПолучитьЭлементы(СтруктураВарианта, Родитель).Индекс(Строка) > 0;
	ЕстьПодчиненные = (Строка.ПолучитьЭлементы().Количество() > 0);
	ЕстьСоседние = ПолучитьЭлементы(СтруктураВарианта, Родитель).Количество() > 1;
	
	МожноДобавлятьВложенные = (Строка.Тип <> "ТаблицаКомпоновкиДанных"
		И Строка.Тип <> "ДиаграммаКомпоновкиДанных");
	
	МожноГруппировать = (Строка.Тип <> "НастройкиКомпоновкиДанных"
		И Строка.Тип <> "НастройкиВложенногоОбъектаКомпоновкиДанных"
		И Строка.Тип <> "КоллекцияЭлементовСтруктурыТаблицыКомпоновкиДанных"
		И Строка.Тип <> "КоллекцияЭлементовСтруктурыДиаграммыКомпоновкиДанных");
	
	МожноОткрывать = (Строка.Тип <> "НастройкиКомпоновкиДанных"
		И Строка.Тип <> "НастройкиВложенногоОбъектаКомпоновкиДанных"
		И Строка.Тип <> "ТаблицаКомпоновкиДанных"
		И Строка.Тип <> "ДиаграммаКомпоновкиДанных"
		И Строка.Тип <> "КоллекцияЭлементовСтруктурыТаблицыКомпоновкиДанных"
		И Строка.Тип <> "КоллекцияЭлементовСтруктурыДиаграммыКомпоновкиДанных");
	
	МожноУдалятьИПеремещать = (Строка.Тип <> "НастройкиКомпоновкиДанных"
		И Строка.Тип <> "НастройкиВложенногоОбъектаКомпоновкиДанных"
		И Строка.Тип <> "КоллекцияЭлементовСтруктурыТаблицыКомпоновкиДанных"
		И Строка.Тип <> "КоллекцияЭлементовСтруктурыДиаграммыКомпоновкиДанных");
	
	МожноДобавлятьТаблицыИДиаграммы = (Строка.Тип = "НастройкиКомпоновкиДанных"
		Или Строка.Тип = "НастройкиВложенногоОбъектаКомпоновкиДанных"
		Или Строка.Тип = "ГруппировкаКомпоновкиДанных");
	
	РодителяМожноПеремещать = (ЕстьРодитель
		И Родитель.Тип <> "НастройкиКомпоновкиДанных"
		И Родитель.Тип <> "КоллекцияЭлементовСтруктурыТаблицыКомпоновкиДанных"
		И Родитель.Тип <> "КоллекцияЭлементовСтруктурыДиаграммыКомпоновкиДанных");
		
	Элементы.СтруктураВарианта_Добавить.Доступность  = МожноДобавлятьВложенные;
	Элементы.СтруктураВарианта_Добавить1.Доступность = МожноДобавлятьВложенные;
	Элементы.СтруктураВарианта_Изменить.Доступность  = МожноОткрывать;
	Элементы.СтруктураВарианта_Изменить1.Доступность = МожноОткрывать;
	Элементы.СтруктураВарианта_ДобавитьТаблицу.Доступность  = МожноДобавлятьТаблицыИДиаграммы;
	Элементы.СтруктураВарианта_ДобавитьТаблицу1.Доступность = МожноДобавлятьТаблицыИДиаграммы;
	Элементы.СтруктураВарианта_ДобавитьДиаграмму.Доступность  = МожноДобавлятьТаблицыИДиаграммы;
	Элементы.СтруктураВарианта_ДобавитьДиаграмму1.Доступность = МожноДобавлятьТаблицыИДиаграммы;
	Элементы.СтруктураВарианта_Удалить.Доступность  = МожноУдалятьИПеремещать;
	Элементы.СтруктураВарианта_Удалить1.Доступность = МожноУдалятьИПеремещать;
	Элементы.СтруктураВарианта_Сгруппировать.Доступность  = МожноГруппировать;
	Элементы.СтруктураВарианта_Сгруппировать1.Доступность = МожноГруппировать;
	Элементы.СтруктураВарианта_ПереместитьВышеИЛевее.Доступность  = МожноУдалятьИПеремещать И РодителяМожноПеремещать И МожноДобавлятьВложенные И МожноГруппировать;
	Элементы.СтруктураВарианта_ПереместитьВышеИЛевее1.Доступность = МожноУдалятьИПеремещать И РодителяМожноПеремещать И МожноДобавлятьВложенные И МожноГруппировать;
	Элементы.СтруктураВарианта_ПереместитьНижеИПравее.Доступность  = МожноУдалятьИПеремещать И ЕстьПодчиненные И МожноДобавлятьВложенные И МожноГруппировать;
	Элементы.СтруктураВарианта_ПереместитьНижеИПравее1.Доступность = МожноУдалятьИПеремещать И ЕстьПодчиненные И МожноДобавлятьВложенные И МожноГруппировать;
	Элементы.СтруктураВарианта_ПереместитьВверх.Доступность  = МожноУдалятьИПеремещать И ЕстьСоседние;
	Элементы.СтруктураВарианта_ПереместитьВверх1.Доступность = МожноУдалятьИПеремещать И ЕстьСоседние;
	Элементы.СтруктураВарианта_ПереместитьВниз.Доступность  = МожноУдалятьИПеремещать И ЕстьСоседние;
	Элементы.СтруктураВарианта_ПереместитьВниз1.Доступность = МожноУдалятьИПеремещать И ЕстьСоседние;
	Элементы.СтруктураВарианта_ПереместитьНаУровеньВыше.Доступность = МожноУдалятьИПеремещать И  ЕстьРодитель И РодителяМожноПеремещать;
	Элементы.СтруктураВарианта_ПереместитьНаУровеньВыше1.Доступность = МожноУдалятьИПеремещать И ЕстьРодитель И РодителяМожноПеремещать;
	Элементы.СтруктураВарианта_ПереместитьНаУровеньНиже.Доступность = МожноУдалятьИПеремещать И ЕстьПотенциальныеРодители;
	Элементы.СтруктураВарианта_ПереместитьНаУровеньНиже1.Доступность = МожноУдалятьИПеремещать И ЕстьПотенциальныеРодители;
КонецПроцедуры

&НаКлиенте
Процедура ИзменитьЭлементСтруктуры(Строка, ИмяСтраницы = Неопределено, ИспользоватьФормуВарианта = Неопределено)
	Если Строка = Неопределено Тогда
		Строки = СтруктураВарианта.ПолучитьЭлементы();
		Если Строки.Количество() = 0 Тогда
			Возврат;
		КонецЕсли;
		Строка = Строки[0];
	КонецЕсли;
	
	Если ИспользоватьФормуВарианта = Неопределено Тогда
		ИспользоватьФормуВарианта = (Строка.Тип = "ТаблицаКомпоновкиДанных"
			Или Строка.Тип = "НастройкиВложенногоОбъектаКомпоновкиДанных");
	КонецЕсли;
	
	Обработчик = Новый ОписаниеОповещения("ИзменитьЭлементСтруктурыЗавершение", ЭтотОбъект);
	
	ШаблонЗаголовка = НСтр("ru = 'Настройка %1 отчета ""%2""'");
	Если Строка.Тип = "ДиаграммаКомпоновкиДанных" Тогда
		ПредставлениеЭлемента = НСтр("ru = 'диаграммы'");
	Иначе
		ПредставлениеЭлемента = НСтр("ru = 'группировки'");
	КонецЕсли;
	
	Если ЗначениеЗаполнено(Строка.Заголовок) Тогда
		ПредставлениеЭлемента = ПредставлениеЭлемента + " """ + Строка.Заголовок + """";
	ИначеЕсли ЗначениеЗаполнено(Строка.Представление) Тогда
		ПредставлениеЭлемента = ПредставлениеЭлемента + " """ + Строка.Представление + """";
	КонецЕсли;
	
	СвойствоЭлементаСтруктуры = СвойствоЭлементаСтруктурыНастроек(Отчет.КомпоновщикНастроек, "Структура");
	ЭлементНастройки = ЭлементНастройки(СвойствоЭлементаСтруктуры, Строка);
	
	ПутьКЭлементуСтруктурыНастроек = ОтчетыКлиент.ПолныйПутьКЭлементуНастроек(
		Отчет.КомпоновщикНастроек.Настройки, ЭлементНастройки);
	
	ПараметрыФормы = Новый Структура;
	ПараметрыФормы.Вставить("КлючВарианта", Строка(КлючТекущегоВарианта));
	ПараметрыФормы.Вставить("Вариант", Отчет.КомпоновщикНастроек.Настройки);
	ПараметрыФормы.Вставить("ПользовательскиеНастройки", Отчет.КомпоновщикНастроек.ПользовательскиеНастройки);
	ПараметрыФормы.Вставить("НастройкиОтчета", НастройкиОтчета);
	ПараметрыФормы.Вставить("ВариантНаименование", ВариантНаименование);
	ПараметрыФормы.Вставить("ИдентификаторЭлементаСтруктурыНастроек", Строка.Идентификатор);
	ПараметрыФормы.Вставить("ПутьКЭлементуСтруктурыНастроек", ПутьКЭлементуСтруктурыНастроек);
	ПараметрыФормы.Вставить("ТипЭлементаСтруктурыНастроек", Строка.Тип);
	ПараметрыФормы.Вставить("Заголовок", СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
		ШаблонЗаголовка, ПредставлениеЭлемента, ВариантНаименование));
	Если ИмяСтраницы <> Неопределено Тогда
		ПараметрыФормы.Вставить("ИмяСтраницы", ИмяСтраницы);
	КонецЕсли;
	
	ВыполнятьЗамеры = НастройкиОтчета.ВыполнятьЗамеры И ЗначениеЗаполнено(НастройкиОтчета.КлючЗамеров);
	Если ВыполнятьЗамеры Тогда
		МодульОценкаПроизводительностиКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("ОценкаПроизводительностиКлиент");
		МодульОценкаПроизводительностиКлиент.ЗамерВремени(
			НастройкиОтчета.КлючЗамеров + ".Настройки", Ложь, Ложь);
	КонецЕсли;
	
	ИмяОткрываемойФормы = НастройкиОтчета.ПолноеИмя + ?(ИспользоватьФормуВарианта, ".ФормаВарианта", ".ФормаНастроек");
	ОткрытьФорму(ИмяОткрываемойФормы, ПараметрыФормы, ЭтотОбъект,,,, Обработчик, РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);
КонецПроцедуры

&НаКлиенте
Процедура ИзменитьЭлементСтруктурыЗавершение(Результат, Контекст) Экспорт
	Если ТипЗнч(Результат) <> Тип("Структура")
		Или Результат = КодВозвратаДиалога.Отмена Тогда
		Возврат;
	КонецЕсли;
	
	Если Результат.ВариантМодифицирован Тогда 
		ОбновитьФорму(Результат);
		
		Раздел = КорневаяСтрокаПоУмолчанию("СтруктураВарианта");
		Элементы.СтруктураВарианта.Развернуть(Раздел.ПолучитьИдентификатор(), Истина);
	КонецЕсли;
КонецПроцедуры

#КонецОбласти

#Область Общее

#Область ОбработчикиОповещений

&НаКлиенте
Функция ПараметрыЗаполненияСписка(ЗакрыватьПриВыборе = Ложь, МножественныйВыбор = Истина, ДобавлятьСтроку = Истина)
	ПараметрыЗаполнения = Новый Структура("ПутьКСписку, Индекс, Владелец, ВыбранныйТип, ВыборГруппИЭлементов");
	ПараметрыЗаполнения.Вставить("ДобавлятьСтроку", ДобавлятьСтроку);
	// Стандартные параметры формы.
	ПараметрыЗаполнения.Вставить("ЗакрыватьПриВыборе", ЗакрыватьПриВыборе);
	ПараметрыЗаполнения.Вставить("ЗакрыватьПриЗакрытииВладельца", Истина);
	ПараметрыЗаполнения.Вставить("Отбор", Новый Структура);
	// Стандартные параметры формы выбора (см. Расширение управляемой формы для динамического списка).
	ПараметрыЗаполнения.Вставить("МножественныйВыбор", МножественныйВыбор);
	ПараметрыЗаполнения.Вставить("РежимВыбора", Истина);
	// Предполагаемые реквизиты.
	ПараметрыЗаполнения.Вставить("РежимОткрытияОкна", РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);
	ПараметрыЗаполнения.Вставить("РазрешитьНачалоПеретаскивания", Ложь);
	
	Возврат ПараметрыЗаполнения;
КонецФункции

&НаКлиенте
Процедура НачатьЗаполнениеСписка(Элемент, ПараметрыЗаполнения, ВыборПереопределен = Неопределено)
	Список = ЭтотОбъект[ПараметрыЗаполнения.ПутьКСписку];
	ПолеСписка = Элементы[ПараметрыЗаполнения.ПутьКСписку]; // ТаблицаФормы
	ПолеЗначения = Элементы[ПараметрыЗаполнения.ПутьКСписку + "Значение"];
	
	Сведения = ОтчетыКлиент.СведенияОЭлементеНастройки(Отчет.КомпоновщикНастроек, ПараметрыЗаполнения.Индекс);
	
	ВыборГруппИЭлементов = Неопределено;
	Если Сведения.Описание <> Неопределено Тогда 
		ВыборГруппИЭлементов = Сведения.Описание.ВыборГруппИЭлементов;
	КонецЕсли;
	
	ЭлементПользовательскойНастройки = Сведения.ЭлементПользовательскойНастройки;
	
	Условие = ОтчетыКлиентСервер.УсловиеЭлементаНастройки(ЭлементПользовательскойНастройки, Сведения.Описание);
	ПолеЗначения.ВыборГруппИЭлементов = ОтчетыКлиентСервер.ЗначениеТипаГруппыИЭлементы(
		ВыборГруппИЭлементов, Условие);
	ПараметрыЗаполнения.ВыборГруппИЭлементов = ОтчетыКлиент.ЗначениеТипаИспользованиеГруппИЭлементов(
		ВыборГруппИЭлементов, Условие);
	
	РасширенноеОписаниеТипов = ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры(
		Отчет.КомпоновщикНастроек.Настройки.ДополнительныеСвойства, "РасширенноеОписаниеТипов", Новый Соответствие);
	
	РасширенноеОписаниеТипа = РасширенноеОписаниеТипов[ПараметрыЗаполнения.Индекс];
	Если РасширенноеОписаниеТипа <> Неопределено Тогда 
		Список.ТипЗначения = РасширенноеОписаниеТипа.ОписаниеТиповДляФормы;
	КонецЕсли;
	Список.ТипЗначения = ОписаниеТиповБезПримитивных(Список.ТипЗначения);
	
	ПользовательскиеНастройки = Отчет.КомпоновщикНастроек.ПользовательскиеНастройки.Элементы;
	
	ПараметрыВыбора = ОтчетыКлиентСервер.ПараметрыВыбора(Сведения.Настройки, ПользовательскиеНастройки, Сведения.Элемент);
	ПараметрыЗаполнения.Вставить("ПараметрыВыбора", ПараметрыВыбора);
	
	Список.ТипЗначения = ОтчетыКлиент.ТипЗначенияОграниченныйСвязьюПоТипу(
		Сведения.Настройки, ПользовательскиеНастройки, Сведения.Элемент, Сведения.Описание, Список.ТипЗначения);
	
	Если ТипЗнч(ЭлементПользовательскойНастройки) = Тип("ЭлементОтбораКомпоновкиДанных") Тогда
		ТекущееЗначение = ЭлементПользовательскойНастройки.ПравоеЗначение;
	Иначе
		ТекущееЗначение = ЭлементПользовательскойНастройки.Значение;
	КонецЕсли;
	
	ОтмеченныеЗначения = ОтчетыКлиентСервер.ЗначенияСписком(ТекущееЗначение);
	
	Если ОтмеченныеЗначения.Количество() > 0 Тогда 
		ПараметрыЗаполнения.Вставить("ТекущаяСтрока", ОтмеченныеЗначения[0].Значение);
	КонецЕсли;
	
	Обработчик = Новый ОписаниеОповещения("ЗавершитьЗаполнениеСписка", ЭтотОбъект, ПараметрыЗаполнения);
	
	Если ОтчетыКлиент.ВыборПереопределен(ЭтотОбъект, Обработчик, Сведения.Описание,
			Список.ТипЗначения, ОтмеченныеЗначения, ПараметрыВыбора) Тогда
		ВыборПереопределен = Истина;
		Возврат;
	КонецЕсли;
	
	Если ВыборПереопределен <> Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	Если ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры(ПараметрыЗаполнения, "ЭтоПодбор", Ложь)
		И (ОтчетыКлиент.ЭтоВыборОбъектовМетаданных(Список.ТипЗначения, ОтмеченныеЗначения, Обработчик)
		Или ОтчетыКлиент.ЭтоВыборПользователей(ЭтотОбъект, Элемент, Список.ТипЗначения, ОтмеченныеЗначения, ПараметрыВыбора, Обработчик)) Тогда 
		Возврат;
	КонецЕсли;
	
	Типы = Список.ТипЗначения.Типы();
	Если Типы.Количество() = 0 Тогда
		Если ПараметрыЗаполнения.ДобавлятьСтроку Тогда 
			ПолеСписка.ДобавитьСтроку();
		КонецЕсли;
		Возврат;
	КонецЕсли;
	
	Если Типы.Количество() = 1 Тогда
		ПараметрыЗаполнения.ВыбранныйТип = Типы[0];
		ПродолжитьЗаполнениеСписка(-1, ПараметрыЗаполнения);
		Возврат;
	КонецЕсли;
	
	ДоступныеТипы = Новый СписокЗначений;
	ДоступныеТипы.ЗагрузитьЗначения(Типы);
	
	Обработчик = Новый ОписаниеОповещения("ПродолжитьЗаполнениеСписка", ЭтотОбъект, ПараметрыЗаполнения);
	ПоказатьВыборИзМеню(Обработчик, ДоступныеТипы, Элемент);
КонецПроцедуры

&НаКлиенте
Процедура ПродолжитьЗаполнениеСписка(ВыбранныйЭлемент, ПараметрыЗаполнения) Экспорт
	Если ВыбранныйЭлемент = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	Если ВыбранныйЭлемент <> -1 Тогда
		ПараметрыЗаполнения.ВыбранныйТип = ВыбранныйЭлемент.Значение;
	КонецЕсли;
	
	ПараметрыПодбора = ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры(
		Отчет.КомпоновщикНастроек.Настройки.ДополнительныеСвойства, "ПараметрыПодбора", Новый Соответствие);
	
	ПутьКФорме = ПараметрыПодбора[ПараметрыЗаполнения.Индекс];
	Если Не ЗначениеЗаполнено(ПутьКФорме) Тогда 
		ПутьКФорме = ПараметрыПодбора[ПараметрыЗаполнения.ВыбранныйТип];
	КонецЕсли;
	
	Для Каждого Параметр Из ПараметрыЗаполнения.ПараметрыВыбора Цикл 
		Если Не ЗначениеЗаполнено(Параметр.Имя) Тогда
			Продолжить;
		КонецЕсли;
		
		Если СтрНачинаетсяС(ВРег(Параметр.Имя), "ОТБОР.") Тогда 
			ПараметрыЗаполнения.Отбор.Вставить(СтрРазделить(Параметр.Имя, ".")[1], Параметр.Значение);
		Иначе
			ПараметрыЗаполнения.Вставить(Параметр.Имя, Параметр.Значение);
		КонецЕсли;
	КонецЦикла;
	
	Владелец = ПараметрыЗаполнения.Владелец;
	ПараметрыЗаполнения.Удалить("Владелец");
	
	ОткрытьФорму(ПутьКФорме, ПараметрыЗаполнения, Владелец);
КонецПроцедуры

&НаКлиенте
Процедура ЗавершитьЗаполнениеСписка(ВыбранныеЗначения, ПараметрыЗаполнения) Экспорт
	Если ТипЗнч(ВыбранныеЗначения) = Тип("Массив") Тогда
		Значения = ВыбранныеЗначения;
		
		ВыбранныеЗначения = Новый СписокЗначений;
		ВыбранныеЗначения.ЗагрузитьЗначения(Значения);
		ВыбранныеЗначения.ЗаполнитьПометки(Истина);
	ИначеЕсли ТипЗнч(ВыбранныеЗначения) <> Тип("СписокЗначений") Тогда
		Возврат;
	КонецЕсли;
	
	ПутьКСписку = ПараметрыЗаполнения.ПутьКСписку;
	Список = ЭтотОбъект[ПутьКСписку];
	
	Индекс = Список.Количество() - 1;
	Пока Индекс >= 0 Цикл 
		Элемент = Список[Индекс];
		Индекс = Индекс - 1;
		
		Если Элемент.Пометка
			И ВыбранныеЗначения.НайтиПоЗначению(Элемент.Значение) = Неопределено Тогда 
			Список.Удалить(Элемент);
		КонецЕсли;
	КонецЦикла;
	
	Для Каждого Элемент Из ВыбранныеЗначения Цикл 
		ОтчетыКлиентСервер.ДобавитьУникальноеЗначениеВСписок(Список, Элемент.Значение, Элемент.Представление, Истина);
	КонецЦикла;
	
	КомпоновщикНастроек = Отчет.КомпоновщикНастроек;
	
	Индекс = ПутьКДаннымЭлементов.ПоИмени[ПутьКСписку];
	ЭлементНастройки = КомпоновщикНастроек.ПользовательскиеНастройки.Элементы[Индекс];
	ЭлементНастройки.Использование = Истина;
	
	Если ТипЗнч(ЭлементНастройки) = Тип("ЭлементОтбораКомпоновкиДанных") Тогда
		ЭлементНастройки.ПравоеЗначение = ВыбранныеЗначения;
	Иначе
		ЭлементНастройки.Значение = ВыбранныеЗначения;
	КонецЕсли;
	
	ОформитьСписок(Элементы[ПутьКСписку], ЭлементНастройки);
КонецПроцедуры

&НаКлиенте
Процедура ВставитьИзБуфераЗавершение(НайденныеОбъекты, ПутьКСписку) Экспорт
	Если НайденныеОбъекты = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	Список = ЭтотОбъект[ПутьКСписку];
	
	КомпоновщикНастроек = Отчет.КомпоновщикНастроек;
	
	Индекс = ПутьКДаннымЭлементов.ПоИмени[ПутьКСписку];
	ЭлементНастройки = КомпоновщикНастроек.ПользовательскиеНастройки.Элементы[Индекс];
	
	Если ТипЗнч(ЭлементНастройки) = Тип("ЭлементОтбораКомпоновкиДанных") Тогда
		Если ЭлементНастройки.ПравоеЗначение = Неопределено Тогда
			ЭлементНастройки.ПравоеЗначение = Новый СписокЗначений;
		КонецЕсли;
		
		Отмеченные = ЭлементНастройки.ПравоеЗначение;
	Иначе
		Если ЭлементНастройки.Значение = Неопределено Тогда
			ЭлементНастройки.Значение = Новый СписокЗначений;
		КонецЕсли;
		
		Отмеченные = ЭлементНастройки.Значение;
	КонецЕсли;
	
	Для Каждого Значение Из НайденныеОбъекты Цикл
		ОтчетыКлиентСервер.ДобавитьУникальноеЗначениеВСписок(Список, Значение, Неопределено, Истина);
		ОтчетыКлиентСервер.ДобавитьУникальноеЗначениеВСписок(Отмеченные, Значение, Неопределено, Истина);
	КонецЦикла;
	
	ЭлементНастройки.Использование = Истина;
	
	ОформитьСписок(Элементы[ПутьКСписку], ЭлементНастройки);
КонецПроцедуры

#КонецОбласти

&НаКлиентеНаСервереБезКонтекста
Функция СвойствоЭлементаСтруктурыНастроек(КомпоновщикНастроек, Ключ, ИдентификаторЭлемента = Неопределено, Режим = Неопределено)
	Настройки = КомпоновщикНастроек.Настройки;
	
	Если Ключ = "Структура" Тогда 
		Возврат Настройки;
	КонецЕсли;
	
	ЭлементСтруктуры = ЭлементСтруктурыНастроек(Настройки, ИдентификаторЭлемента);
	
	ТипЭлементаСтруктуры = ТипЗнч(ЭлементСтруктуры);
	Если ЭлементСтруктуры = Неопределено
		Или (ТипЭлементаСтруктуры = Тип("ТаблицаКомпоновкиДанных") И Ключ <> "Выбор" И Ключ <> "УсловноеОформление")
		Или (ТипЭлементаСтруктуры = Тип("ДиаграммаКомпоновкиДанных") И Ключ <> "Выбор" И Ключ <> "УсловноеОформление")
		Или (ТипЭлементаСтруктуры = Тип("НастройкиКомпоновкиДанных") И Ключ = "ПоляГруппировки")
		Или (ТипЭлементаСтруктуры = Тип("ГруппировкаКомпоновкиДанных") И Ключ = "ПараметрыДанных")
		Или (ТипЭлементаСтруктуры = Тип("ГруппировкаТаблицыКомпоновкиДанных") И Ключ = "ПараметрыДанных")
		Или (ТипЭлементаСтруктуры = Тип("ГруппировкаДиаграммыКомпоновкиДанных") И Ключ = "ПараметрыДанных") Тогда 
		Возврат Неопределено;
	КонецЕсли;
	
	СвойствоЭлементаСтруктуры = ЭлементСтруктуры[Ключ];
	
	Если Режим = 0
		И (ТипЗнч(СвойствоЭлементаСтруктуры) = Тип("ВыбранныеПоляКомпоновкиДанных")
			Или ТипЗнч(СвойствоЭлементаСтруктуры) = Тип("ПорядокКомпоновкиДанных"))
		И ЗначениеЗаполнено(СвойствоЭлементаСтруктуры.ИдентификаторПользовательскойНастройки) Тогда 
		
		СвойствоЭлементаСтруктуры = КомпоновщикНастроек.ПользовательскиеНастройки.Элементы.Найти(
			СвойствоЭлементаСтруктуры.ИдентификаторПользовательскойНастройки);
	КонецЕсли;
	
	Возврат СвойствоЭлементаСтруктуры;
КонецФункции

&НаКлиентеНаСервереБезКонтекста
Функция ЭлементСтруктурыНастроек(Настройки, ИдентификаторЭлемента)
	Если ТипЗнч(ИдентификаторЭлемента) = Тип("ИдентификаторКомпоновкиДанных") Тогда 
		ЭлементСтруктуры = Настройки.ПолучитьОбъектПоИдентификатору(ИдентификаторЭлемента);
	Иначе
		ЭлементСтруктуры = Настройки;
	КонецЕсли;
	
	Возврат ЭлементСтруктуры;
КонецФункции

&НаКлиентеНаСервереБезКонтекста
Функция КлючСвойстваЭлементаСтруктурыНастроек(ИмяКоллекции, Строка)
	Ключ = Неопределено;
	
	Если ИмяКоллекции = "СоставГруппировки" Тогда 
		Ключ = "ПоляГруппировки";
	ИначеЕсли ИмяКоллекции = "Параметры" Или ИмяКоллекции = "Отборы" Тогда 
		Если Строка.Свойство("ЭтоПараметр") И Строка.ЭтоПараметр Тогда 
			Ключ = "ПараметрыДанных";
		Иначе
			Ключ = "Отбор";
		КонецЕсли;
	ИначеЕсли ИмяКоллекции = "ВыбранныеПоля" Тогда 
		Ключ = "Выбор";
	ИначеЕсли ИмяКоллекции = "Сортировка" Тогда 
		Ключ = "Порядок";
	ИначеЕсли ИмяКоллекции = "Оформление" Тогда 
		Если Строка.Свойство("ЭтоПараметрВывода") И Строка.ЭтоПараметрВывода Тогда 
			Ключ = "ПараметрыВывода";
		Иначе
			Ключ = "УсловноеОформление";
		КонецЕсли;
	ИначеЕсли ИмяКоллекции = "СтруктураВарианта" Тогда 
		Ключ = "Структура";
	КонецЕсли;
	
	Возврат Ключ;
КонецФункции

&НаКлиенте
Процедура УдалитьСтроки(Элемент, Отказ)
	Отказ = Истина;
	
	ИдентификаторыСтрок = Элемент.ВыделенныеСтроки;
	
	Индекс = ИдентификаторыСтрок.ВГраница();
	Пока Индекс >= 0 Цикл 
		Строка = ЭтотОбъект[Элемент.Имя].НайтиПоИдентификатору(ИдентификаторыСтрок[Индекс]);
		Индекс = Индекс - 1;
		
		Если ТипЗнч(Строка.Идентификатор) <> Тип("ИдентификаторКомпоновкиДанных")
			Или (Строка.Свойство("ЭтоРаздел") И Строка.ЭтоРаздел)
			Или (Строка.Свойство("ЭтоПараметр") И Строка.ЭтоПараметр)
			Или (Строка.Свойство("ЭтоПараметрВывода") И Строка.ЭтоПараметрВывода) Тогда 
			Продолжить;
		КонецЕсли;
		
		Строки = ПолучитьРодителя(Элемент.Имя, Строка).ПолучитьЭлементы();
		Если Строки.Индекс(Строка) < 0 Тогда 
			Продолжить;
		КонецЕсли;
			
		КлючСвойства = КлючСвойстваЭлементаСтруктурыНастроек(Элемент.Имя, Строка);
		СвойствоЭлементаСтруктуры = СвойствоЭлементаСтруктурыНастроек(
			Отчет.КомпоновщикНастроек, КлючСвойства, ИдентификаторЭлементаСтруктурыНастроек, РасширенныйРежим);
		
		ЭлементНастройки = ЭлементНастройки(СвойствоЭлементаСтруктуры, Строка);
		Если ТипЗнч(ЭлементНастройки) = Тип("КоллекцияЭлементовСтруктурыТаблицыКомпоновкиДанных")
			Или ТипЗнч(ЭлементНастройки) = Тип("КоллекцияЭлементовСтруктурыДиаграммыКомпоновкиДанных") Тогда 
			Продолжить;
		КонецЕсли;
		
		РодительЭлементаНастройки = ПолучитьРодителяЭлементаНастройки(СвойствоЭлементаСтруктуры, ЭлементНастройки);
		ИмяКоллекции = ИмяКоллекцииНастроекПоИдентификатору(Строка.Идентификатор);
		ЭлементыНастроек = ЭлементыНастроек(СвойствоЭлементаСтруктуры, РодительЭлементаНастройки, ИмяКоллекции);
		
		Строка.Использование = Ложь;
		ИзменитьИспользованиеСвязанныхЭлементовНастроек(Элемент.Имя, Строка, ЭлементНастройки);
		
		ЭлементыНастроек.Удалить(ЭлементНастройки);
		Строки.Удалить(Строка);
	КонецЦикла;
	
	УстановитьМодифицированность();
КонецПроцедуры

&НаКлиенте
Процедура СкопироватьНастройки(Элемент)
	
	СтрокаКопирования = Элемент.ТекущиеДанные;
	
	Если ТипЗнч(СтрокаКопирования.Идентификатор) <> Тип("ИдентификаторКомпоновкиДанных")
		Или (СтрокаКопирования.Свойство("ЭтоРаздел") И СтрокаКопирования.ЭтоРаздел)
		Или (СтрокаКопирования.Свойство("ЭтоПараметр") И СтрокаКопирования.ЭтоПараметр)
		Или (СтрокаКопирования.Свойство("ЭтоПараметрВывода") И СтрокаКопирования.ЭтоПараметрВывода) Тогда 
		Возврат;
	КонецЕсли;
	
	Родитель = СтрокаКопирования.ПолучитьРодителя();
	
	КлючСвойства = КлючСвойстваЭлементаСтруктурыНастроек(Элемент.Имя, СтрокаКопирования);
	УзелКД = СвойствоЭлементаСтруктурыНастроек(
			Отчет.КомпоновщикНастроек, КлючСвойства, ИдентификаторЭлементаСтруктурыНастроек, РасширенныйРежим);

	КудаВставить = ПолучитьЭлементы(ЭтотОбъект[Элемент.Имя], Родитель);
		
	ЭлементКД = ЭлементНастройки(УзелКД, СтрокаКопирования);
	РодительКД = ЭлементНастройки(УзелКД, Родитель);
	КудаВставитьКД = ЭлементыНастроек(УзелКД, РодительКД);
	
	Индекс = КудаВставить.Количество();
	ИндексЭлементаНастройки = КудаВставитьКД.Количество();
	
	ПоискЭлементовКД = Новый Соответствие;
	ОтчетыКлиентСервер.СкопироватьРекурсивно(УзелКД, ЭлементКД, КудаВставитьКД, ИндексЭлементаНастройки, ПоискЭлементовКД);
	
	ПоискСтрокТаблицы = Новый Соответствие;
	ОтчетыКлиентСервер.СкопироватьРекурсивно(Неопределено, СтрокаКопирования, КудаВставить, Индекс, ПоискСтрокТаблицы);  
	
	Для Каждого КлючИЗначение Из ПоискСтрокТаблицы Цикл
		СтараяСтрока = КлючИЗначение.Ключ; 
		НоваяСтрока = КлючИЗначение.Значение;
		НоваяСтрока.Идентификатор = ПоискЭлементовКД.Получить(СтараяСтрока.Идентификатор);
	КонецЦикла;
	
	УстановитьМодифицированность();
	
КонецПроцедуры

&НаКлиенте
Процедура ИзменитьИспользование(ИмяКоллекции, Использование = Истина, Строки = Неопределено)
	Если Строки = Неопределено Тогда 
		КорневаяСтрока = КорневаяСтрокаПоУмолчанию(ИмяКоллекции);
		Если КорневаяСтрока = Неопределено Тогда 
			Возврат;
		КонецЕсли;
		
		Строки = КорневаяСтрока.ПолучитьЭлементы();
	КонецЕсли;
	
	Для Каждого Строка Из Строки Цикл 
		Строка.Использование = Использование;
		
		КлючСвойства = КлючСвойстваЭлементаСтруктурыНастроек(ИмяКоллекции, Строка);
		СвойствоЭлементаСтруктуры = СвойствоЭлементаСтруктурыНастроек(
			Отчет.КомпоновщикНастроек, КлючСвойства, ИдентификаторЭлементаСтруктурыНастроек, РасширенныйРежим);
		
		ЭлементНастройки = ЭлементНастройки(СвойствоЭлементаСтруктуры, Строка);
		Если ТипЗнч(ЭлементНастройки) <> Тип("НастройкиКомпоновкиДанных")
			И ТипЗнч(ЭлементНастройки) <> Тип("КоллекцияЭлементовСтруктурыТаблицыКомпоновкиДанных")
			И ТипЗнч(ЭлементНастройки) <> Тип("КоллекцияЭлементовСтруктурыДиаграммыКомпоновкиДанных") Тогда 
			ЭлементНастройки.Использование = Использование;
		КонецЕсли;
		
		ИзменитьИспользование(ИмяКоллекции, Использование, Строка.ПолучитьЭлементы());
	КонецЦикла;
	
	УстановитьМодифицированность();
КонецПроцедуры

&НаКлиенте
Процедура ИзменитьИспользованиеЭлементаНастройки(ИмяКоллекции)
	Строка = Элементы[ИмяКоллекции].ТекущиеДанные;
	
	КомпоновщикНастроек = Отчет.КомпоновщикНастроек;
	
	КлючСвойства = КлючСвойстваЭлементаСтруктурыНастроек(ИмяКоллекции, Строка);
	СвойствоЭлементаСтруктуры = СвойствоЭлементаСтруктурыНастроек(
		КомпоновщикНастроек, КлючСвойства, ИдентификаторЭлементаСтруктурыНастроек, РасширенныйРежим);
	
	ЭлементНастройки = ЭлементНастройки(СвойствоЭлементаСтруктуры, Строка);
	РодительЭлементаНастройки = ПолучитьРодителяЭлементаНастройки(СвойствоЭлементаСтруктуры, ЭлементНастройки);
	
	Если ТипЗнч(РодительЭлементаНастройки) = Тип("НастройкиВложенногоОбъектаКомпоновкиДанных") Тогда
		ЭлементНастройки = РодительЭлементаНастройки;
	КонецЕсли;
	
	ЭлементНастройки.Использование = Строка.Использование;
	
	Если Строка.Свойство("ЭтоПараметрВывода")
		И Строка.ЭтоПараметрВывода
		И Строка(Строка.Идентификатор) = "DATAPARAMETERSOUTPUT" Тогда 
		
		ЭлементНастройки.Использование = Истина;
		ЭлементНастройки.Значение = ?(Строка.Использование,
			ТипВыводаТекстаКомпоновкиДанных.Авто, ТипВыводаТекстаКомпоновкиДанных.НеВыводить);
	КонецЕсли;
	
	Если РасширенныйРежим = 0 И ИмяКоллекции = "СтруктураВарианта" Тогда 
		ЭлементПользовательскойНастройки = КомпоновщикНастроек.ПользовательскиеНастройки.Элементы.Найти(
			ЭлементНастройки.ИдентификаторПользовательскойНастройки);
		Если ЭлементПользовательскойНастройки <> Неопределено Тогда 
			ЭлементПользовательскойНастройки.Использование = ЭлементНастройки.Использование;
		КонецЕсли;
	КонецЕсли;
	
	ИзменитьИспользованиеСвязанныхЭлементовНастроек(ИмяКоллекции, Строка, ЭлементНастройки);
	
	УстановитьМодифицированность();
КонецПроцедуры

&НаКлиенте
Процедура ИзменитьИспользованиеСвязанныхЭлементовНастроек(ИмяКоллекции, Строка, ЭлементНастройки)

	Если ИмяКоллекции = "Оформление" Тогда 
		Если Строка.ЭтоПараметрВывода Тогда
			СинхронизироватьПредопределенныеПараметрыВывода(Строка.Использование, ЭлементНастройки);
		КонецЕсли;
		Возврат;
	КонецЕсли;

	СвязанныеКоллекции = Новый Массив;
	Если ИмяКоллекции = "СоставГруппировки" Тогда
		СвязанныеКоллекции = СтрРазделить("ВыбранныеПоля,Сортировка", ",");
	ИначеЕсли ИмяКоллекции = "ВыбранныеПоля" Тогда
		СвязанныеКоллекции = СтрРазделить("СоставГруппировки,Сортировка", ",");
	КонецЕсли;
	
	Для Каждого СвязаннаяКоллекция Из СвязанныеКоллекции Цикл 
		ИзменитьИспользованиеПоля(СвязаннаяКоллекция, Строка.Поле, Строка.Использование);
	КонецЦикла;
	
КонецПроцедуры

&НаКлиенте
Процедура ИзменитьИспользованиеПоля(ИмяКоллекции, Поле, Использование)
	Если Не ЗначениеЗаполнено(Поле) Тогда
		Возврат;
	КонецЕсли;
	Условие = Новый Структура("Поле", Поле);
	Найденные = ОтчетыКлиентСервер.НайтиСтрокиТаблицы(ЭтотОбъект[ИмяКоллекции], Условие);
	
	СвойствоЭлементаСтруктуры = Неопределено;
	Для Каждого Строка Из Найденные Цикл
		Если Строка.Использование = Использование Тогда
			Продолжить;
		КонецЕсли;
		
		Если СвойствоЭлементаСтруктуры = Неопределено Тогда
			КлючСвойства = КлючСвойстваЭлементаСтруктурыНастроек(ИмяКоллекции, Строка);
			СвойствоЭлементаСтруктуры = СвойствоЭлементаСтруктурыНастроек(
				Отчет.КомпоновщикНастроек, КлючСвойства, ИдентификаторЭлементаСтруктурыНастроек, РасширенныйРежим);
		КонецЕсли;
		
		ЭлементНастройки = ЭлементНастройки(СвойствоЭлементаСтруктуры, Строка);
		Если ЭлементНастройки <> Неопределено Тогда
			Строка.Использование = Использование;
			ЭлементНастройки.Использование = Использование;
		КонецЕсли;
	КонецЦикла;
КонецПроцедуры

&НаСервере
Процедура УстановитьПометкуУдаления(ИмяКоллекции, Строка)
	Строка.ПометкаУдаления = Истина;
	
	Если ИмяКоллекции = "Оформление" Тогда 
		Строка.Картинка = ОтчетыКлиентСервер.ИндексКартинки("Ошибка");
	Иначе
		Строка.Картинка = ОтчетыКлиентСервер.ИндексКартинки("Элемент", "ПометкаУдаления");
	КонецЕсли;
КонецПроцедуры

////////////////////////////////////////////////////////////////////////////////
// Клиент

&НаКлиенте
Процедура ЗаписатьИЗакрыть(Переформировать)
	ОповеститьОВыборе(РезультатВыбора(Переформировать));
КонецПроцедуры

&НаКлиенте
Функция РезультатВыбора(Переформировать)
	РезультатВыбораСформирован = Истина;
	
	Если РежимИзмененияЭлементаСтруктурыНастроек И Не Переформировать Тогда
		Возврат Неопределено;
	КонецЕсли;
	
	РезультатВыбора = Новый Структура;
	РезультатВыбора.Вставить("ИмяСобытия", ВариантыОтчетовСлужебныйКлиентСервер.ИмяСобытияФормыНастроек());
	РезультатВыбора.Вставить("Переформировать", Переформировать);
	РезультатВыбора.Вставить("СброситьПользовательскиеНастройки", РасширенныйРежим = 1);
	РезультатВыбора.Вставить("ФормаНастроекРасширенныйРежим", РасширенныйРежим);
	РезультатВыбора.Вставить("ФормаНастроекИмяСтраницы", Элементы.СтраницыНастроек.ТекущаяСтраница.Имя);
	РезультатВыбора.Вставить("КомпоновщикНастроекКД", Отчет.КомпоновщикНастроек);
	РезультатВыбора.Вставить("ВариантМодифицирован", ВариантИзменен);
	РезультатВыбора.Вставить(
		"ПользовательскиеНастройкиМодифицированы",
		ВариантИзменен Или ПользовательскиеНастройкиМодифицированы);
	
	Возврат РезультатВыбора;
КонецФункции

// Параметры:
//  Настройки - НастройкиКомпоновкиДанных
//
// Возвращаемое значение:
//  Структура:
//    * TITLE - Структура:
//        ** Объект - ЗначениеПараметраКомпоновкиДанных
//        ** Идентификатор - ИдентификаторКомпоновкиДанных
//    * TITLEOUTPUT - Структура:
//        ** Объект - ЗначениеПараметраКомпоновкиДанных
//        ** Идентификатор - ИдентификаторКомпоновкиДанных
//    * DATAPARAMETERSOUTPUT - Структура:
//        ** Объект - ЗначениеПараметраКомпоновкиДанных
//        ** Идентификатор - ИдентификаторКомпоновкиДанных
//    * FILTEROUTPUT - Структура:
//        ** Объект - ЗначениеПараметраКомпоновкиДанных
//        ** Идентификатор - ИдентификаторКомпоновкиДанных
//
&НаКлиентеНаСервереБезКонтекста
Функция ПредопределенныеПараметрыВывода(Настройки)
	ПредопределенныеПараметры = Новый Структура("TITLE, TITLEOUTPUT, DATAPARAMETERSOUTPUT, FILTEROUTPUT");
	
	ПараметрыВывода = Настройки.ПараметрыВывода;
	Для Каждого Параметр Из ПредопределенныеПараметры Цикл 
		СвойстваПараметра = Новый Структура("Объект, Идентификатор");
		СвойстваПараметра.Объект = ПараметрыВывода.Элементы.Найти(Параметр.Ключ);
		СвойстваПараметра.Идентификатор = ПараметрыВывода.ПолучитьИдентификаторПоОбъекту(СвойстваПараметра.Объект);
		
		ПредопределенныеПараметры[Параметр.Ключ] = СвойстваПараметра;
	КонецЦикла;
	
	Возврат ПредопределенныеПараметры;
КонецФункции

&НаКлиенте
Процедура УстановитьПараметрВывода(ЭлементСтруктуры, ИмяПараметра, Значение = Неопределено, Использование = Истина)
	ЗначениеПараметра = ЭлементСтруктуры.ПараметрыВывода.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных(ИмяПараметра));
	Если ЗначениеПараметра = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	Если Значение <> Неопределено Тогда
		ЗначениеПараметра.Значение = Значение;
	КонецЕсли;
	
	Если Использование <> Неопределено Тогда
		ЗначениеПараметра.Использование = Использование;
	КонецЕсли;
КонецПроцедуры

// Параметры:
//  ТаблицаИмя - Строка
//  Действие - Строка
//
// Возвращаемое значение:
//  Структура:
//    * Действие - Строка
//    * ТаблицаИмя - Строка
//    * ПричинаОтказа - Строка
//    * СтрокиДерева - Массив из ДанныеФормыЭлементДерева
//    * ТекущаяСтрока - см. ЭлементКоллекцииФормыНастроек
//    * ТекущийРодитель - см. ЭлементКоллекцииФормыНастроек
//
&НаКлиенте
Функция НовыйКонтекст(Знач ТаблицаИмя, Знач Действие)
	Результат = Новый Структура;
	Результат.Вставить("ПричинаОтказа", "");
	Результат.Вставить("ТаблицаИмя", ТаблицаИмя);
	Результат.Вставить("Действие", Действие);
	Возврат Результат;
КонецФункции

&НаКлиенте
Процедура ОпределитьВыделенныеСтроки(Контекст)
	Контекст.Вставить("СтрокиДерева", Новый Массив); // Выделенные строки (не идентификаторы).
	Контекст.Вставить("ТекущаяСтрока", Неопределено); // Активная строка (не идентификатор).
	ТаблицаЭлемент = Элементы[Контекст.ТаблицаИмя];
	ТаблицаРеквизит = ЭтотОбъект[Контекст.ТаблицаИмя];
	ТекущаяСтрокаИдентификатор = ТаблицаЭлемент.ТекущаяСтрока;
	
	Особенности = Новый Структура("МогутБытьРазделы, МогутБытьПараметры,
		|МогутБытьПараметрыВывода, МогутБытьГруппы, ТребоватьОдногоРодителя");
	Особенности.МогутБытьРазделы = (Контекст.ТаблицаИмя = "Отборы"
		Или Контекст.ТаблицаИмя = "ВыбранныеПоля"
		Или Контекст.ТаблицаИмя = "Сортировка"
		Или Контекст.ТаблицаИмя = "Оформление");
	Особенности.МогутБытьПараметры = (Контекст.ТаблицаИмя = "Отборы");
	Особенности.МогутБытьПараметрыВывода = (Контекст.ТаблицаИмя = "Оформление");
	Особенности.ТребоватьОдногоРодителя = (Контекст.Действие = "Переместить"
		Или Контекст.Действие = "ПереместитьВИерархии"
		Или Контекст.Действие = "Сгруппировать");
	Особенности.МогутБытьГруппы = (Контекст.ТаблицаИмя = "Отборы" Или Контекст.ТаблицаИмя = "ВыбранныеПоля");
	Если Особенности.ТребоватьОдногоРодителя Тогда
		Контекст.Вставить("ТекущийРодитель", -1);
	КонецЕсли;
	Если Особенности.МогутБытьГруппы Тогда
		БылиГруппы = Ложь;
	КонецЕсли;
	
	ВыделенныеСтроки = МассивСортировать(ТаблицаЭлемент.ВыделенныеСтроки, НаправлениеСортировки.Возр);
	Для Каждого СтрокаИдентификатор Из ВыделенныеСтроки Цикл
		СтрокаДерева = ТаблицаРеквизит.НайтиПоИдентификатору(СтрокаИдентификатор);
		Если Не СтрокаДобавлена(Контекст, СтрокаДерева, Особенности) Тогда
			Возврат;
		КонецЕсли;
		Если Особенности.МогутБытьГруппы И СтрокаДерева.ЭтоГруппа Тогда
			БылиГруппы = Истина;
		КонецЕсли;
		Если СтрокаИдентификатор = ТекущаяСтрокаИдентификатор Тогда
			Контекст.ТекущаяСтрока = СтрокаДерева;
		КонецЕсли;
	КонецЦикла;
	Если Контекст.СтрокиДерева.Количество() = 0 Тогда
		Контекст.ПричинаОтказа = НСтр("ru = 'Выберите элементы.'");
		Возврат;
	КонецЕсли;
	Если Контекст.ТекущаяСтрока = Неопределено Тогда
		Если Контекст.Действие = "ИзменитьГруппу" Тогда
			Контекст.ПричинаОтказа = НСтр("ru = 'Выберите группу.'");
			Возврат;
		КонецЕсли;
	КонецЕсли;
	
	// Исключение из списка удаляемых строк всех подчиненных строк, для которых включены родители.
	Если Контекст.Действие = "Удалить" И Особенности.МогутБытьГруппы И БылиГруппы Тогда
		Количество = Контекст.СтрокиДерева.Количество();
		Для Номер = 1 По Количество Цикл
			ОбратныйИндекс = Количество - Номер;
			Родитель = Контекст.СтрокиДерева[ОбратныйИндекс];
			Пока Родитель <> Неопределено Цикл
				Родитель = Родитель.ПолучитьРодителя();
				Если Контекст.СтрокиДерева.Найти(Родитель) <> Неопределено Тогда
					Контекст.СтрокиДерева.Удалить(ОбратныйИндекс);
					Прервать;
				КонецЕсли;
			КонецЦикла;
		КонецЦикла;
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Функция СтрокаДобавлена(Строки, СтрокаДерева, Особенности)
	Если Строки.СтрокиДерева.Найти(СтрокаДерева) <> Неопределено Тогда
		Возврат Истина; // Пропустить строку.
	КонецЕсли;
	Если Особенности.МогутБытьРазделы И СтрокаДерева.ЭтоРаздел Тогда
		Возврат Истина; // Пропустить строку.
	КонецЕсли;
	Если (Особенности.МогутБытьПараметры И СтрокаДерева.ЭтоПараметр)
		Или (Особенности.МогутБытьПараметрыВывода И СтрокаДерева.ЭтоПараметрВывода) Тогда
		Если Строки.Действие = "Переместить" Тогда
			Строки.ПричинаОтказа = НСтр("ru = 'Параметры не могут быть перемещены.'");
		ИначеЕсли Строки.Действие = "Сгруппировать" Тогда
			Строки.ПричинаОтказа = НСтр("ru = 'Параметры не могут быть участниками групп.'");
		ИначеЕсли Строки.Действие = "Удалить" Тогда
			Строки.ПричинаОтказа = НСтр("ru = 'Параметры не могут быть удалены.'");
		КонецЕсли;
		Возврат Ложь;
	КонецЕсли;
	Если Особенности.ТребоватьОдногоРодителя Тогда
		Родитель = СтрокаДерева.ПолучитьРодителя();
		Если Строки.ТекущийРодитель = -1 Тогда
			Строки.ТекущийРодитель = Родитель;
		ИначеЕсли Строки.ТекущийРодитель <> Родитель Тогда
			Если Строки.Действие = "Переместить" Тогда
				Строки.ПричинаОтказа = НСтр("ru = 'Выбранные элементы не могут быть перемещены, поскольку они принадлежат разным родителям.'");
			ИначеЕсли Строки.Действие = "Сгруппировать" Тогда
				Строки.ПричинаОтказа = НСтр("ru = 'Выбранные элементы не могут быть сгруппированы, поскольку они принадлежат разным родителям.'");
			КонецЕсли;
			Возврат Ложь; 
		КонецЕсли;
	КонецЕсли;
	Строки.СтрокиДерева.Добавить(СтрокаДерева);
	Возврат Истина; // Следующая строка.
КонецФункции

&НаКлиенте
Процедура СдвинутьСтроки(Контекст)
	ТекущийРодитель = Контекст.ТекущийРодитель; // см. ЭлементКоллекцииФормыНастроек
	УзелКД = СвойствоЭлементаСтруктурыНастроек(Отчет.КомпоновщикНастроек, "Структура");
	
	Если Контекст.ТекущийРодитель = Неопределено Тогда
		ТаблицаРеквизит = ЭтотОбъект[Контекст.ТаблицаИмя];
		Если Контекст.ТаблицаИмя = "Отборы" И Не РежимИзмененияЭлементаСтруктурыНастроек Тогда
			ТекущийРодитель = ТаблицаРеквизит.ПолучитьЭлементы()[1];
		Иначе
			ТекущийРодитель = ТаблицаРеквизит;
		КонецЕсли;
		ТекущийРодительКД = УзелКД;
	ИначеЕсли ТипЗнч(ТекущийРодитель.Идентификатор) <> Тип("ИдентификаторКомпоновкиДанных") Тогда
		ТекущийРодительКД = УзелКД;
	Иначе
		ТекущийРодительКД = УзелКД.ПолучитьОбъектПоИдентификатору(ТекущийРодитель.Идентификатор);
	КонецЕсли;
	СтрокиРодителя = ТекущийРодитель.ПолучитьЭлементы();
	СтрокиРодителяКД = ЭлементыНастроек(УзелКД, ТекущийРодительКД);
	
	ВерхняяГраницаСтрок = СтрокиРодителя.Количество() - 1;
	ВыделеноСтрок = Контекст.СтрокиДерева.Количество();
	
	// Массив выделенных строк на встречу движению:
	// Если двигаем строки в "+", то обходим "от большего к меньшему";
	// Если в "-", то обходим "от меньшего к большему".
	ДвигаемсяПоВозрастанию = (Контекст.Направление < 0);
	
	Для Номер = 1 По ВыделеноСтрок Цикл
		Если ДвигаемсяПоВозрастанию Тогда 
			ИндексВМассиве = Номер - 1;
		Иначе
			ИндексВМассиве = ВыделеноСтрок - Номер;
		КонецЕсли;
		
		СтрокаДерева = Контекст.СтрокиДерева[ИндексВМассиве]; // см. ЭлементКоллекцииФормыНастроек
		ЭлементКД = УзелКД.ПолучитьОбъектПоИдентификатору(СтрокаДерева.Идентификатор);
		
		ИндексВДереве = СтрокиРодителя.Индекс(СтрокаДерева);
		ГдеОкажетсяСтрока = ИндексВДереве + Контекст.Направление;
		Если ГдеОкажетсяСтрока < 0 Тогда // Перемещаем "в конец".
			СтрокиРодителя.Сдвинуть(ИндексВДереве, ВерхняяГраницаСтрок - ИндексВДереве);
			СтрокиРодителяКД.Сдвинуть(ЭлементКД, ВерхняяГраницаСтрок - ИндексВДереве);
		ИначеЕсли ГдеОкажетсяСтрока > ВерхняяГраницаСтрок Тогда // Перемещаем "в начало".
			СтрокиРодителя.Сдвинуть(ИндексВДереве, -ИндексВДереве);
			СтрокиРодителяКД.Сдвинуть(ЭлементКД, -ИндексВДереве);
		Иначе
			СтрокиРодителя.Сдвинуть(ИндексВДереве, Контекст.Направление);
			СтрокиРодителяКД.Сдвинуть(ЭлементКД, Контекст.Направление);
		КонецЕсли;
	КонецЦикла;
	
	УстановитьМодифицированность();
КонецПроцедуры

// Параметры:
//  Контекст - см. НовыйКонтекст
//
&НаКлиенте
Процедура ПереместитьВИерархии(Контекст)
	
	Если Контекст.ТекущийРодитель = Неопределено Тогда 
		Возврат;
	КонецЕсли;
	
	Если Контекст.Направление > 0 Тогда 
		
		Строки = Контекст.ТекущийРодитель.ПолучитьЭлементы();
		Индекс = Строки.Индекс(Контекст.ТекущаяСтрока) - 1;
		НовыйРодитель = ?(Индекс < 0, Неопределено, Строки.Получить(Индекс));
		
	Иначе
		НовыйРодитель = ПолучитьРодителя(Контекст.ТаблицаИмя, Контекст.ТекущийРодитель);
	КонецЕсли;
	
	Если НовыйРодитель = Неопределено
		Или НовыйРодитель.Тип = "ТаблицаКомпоновкиДанных"
		Или НовыйРодитель.Тип = "ДиаграммаКомпоновкиДанных" Тогда 
		
		Возврат;
	КонецЕсли;
	
	Если Контекст.Направление > 0 Тогда 
		Индекс = НовыйРодитель.ПолучитьЭлементы().Количество();
	Иначе
		Индекс = НовыйРодитель.ПолучитьЭлементы().Индекс(Контекст.ТекущийРодитель) + 1;
	КонецЕсли;
	
	Если Индекс < 0 Тогда 
		Индекс = 0;
	КонецЕсли;
	
	Результат = ПереместитьЭлементыСтруктурыВарианта(Контекст.ТекущаяСтрока, НовыйРодитель,, Индекс, Индекс);
	
	Элементы.СтруктураВарианта.Развернуть(НовыйРодитель.ПолучитьИдентификатор(), Истина);
	Элементы.СтруктураВарианта.ТекущаяСтрока = Результат.Строка.ПолучитьИдентификатор();
	
	УстановитьМодифицированность();
	
КонецПроцедуры

&НаКлиенте
Функция ЭтоПодчиненныеЭлементы(РодительскийЭлементДерева, ЭлементДерева)
	РодительскийЭлемент = ЭлементДерева;
	Пока РодительскийЭлемент <> Неопределено Цикл
		Если РодительскийЭлементДерева = РодительскийЭлемент Тогда
			Возврат Истина;
		КонецЕсли;
		РодительскийЭлемент = РодительскийЭлемент.ПолучитьРодителя();
	КонецЦикла;
	Возврат Ложь;
КонецФункции

////////////////////////////////////////////////////////////////////////////////
// Клиент - Таблицы полей (универсальные точки входа).

&НаКлиенте
Процедура ВыбратьРежимОтображенияДляСтрок(СвойстваЭлементовНастроек, ИмяКоллекции, ПоказыватьРежимыФлажков = Ложь, ТекущийРежимОтображения = Неопределено)
	
	ДоступныеРежимыОтображения = ДоступныеРежимыОтображения(ПоказыватьРежимыФлажков);
	РежимОтображения = ДоступныеРежимыОтображения.НайтиПоЗначению(ТекущийРежимОтображения);
	
	Если РежимОтображения = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	ДоступныеКартинки = ДоступныеКартинкиРежимовОтображения();
	КартинкаРежимаОтображения = ДоступныеКартинки[РежимОтображения.Значение];
	
	Для Каждого СвойстваЭлементаНастроек Из СвойстваЭлементовНастроек Цикл 
		
		Строка = ЭтотОбъект[ИмяКоллекции].НайтиПоИдентификатору(СвойстваЭлементаНастроек.ИдентификаторСтроки); // см. ЭлементКоллекцииФормыНастроек
		ЭлементНастроек = СвойстваЭлементаНастроек.ЭлементНастроек;
		
		Если Строка <> Неопределено И ЭлементНастроек <> Неопределено Тогда
			УстановитьРежимОтображения(ИмяКоллекции, Строка, ЭлементНастроек, КартинкаРежимаОтображения);
		КонецЕсли;
		
	КонецЦикла;
	
	УстановитьМодифицированность();
	
КонецПроцедуры

&НаКлиенте
Процедура ВыбратьРежимОтображенияДляСтроки(ОтборыУзлаНастроек, ИмяКоллекции, ИдентификаторСтроки, ПоказыватьРежимыВвода, ПоказыватьРежимыФлажков, ТекущийРежимОтображения = Неопределено)
	
	Контекст = Новый Структура("ОтборыУзлаНастроек, ИмяКоллекции, ИдентификаторСтроки", ОтборыУзлаНастроек, ИмяКоллекции, ИдентификаторСтроки);
	Обработчик = Новый ОписаниеОповещения("ПослеВыбораРежимаОтображенияСтроки", ЭтотОбъект, Контекст);
	
	ДоступныеРежимыОтображения = ДоступныеРежимыОтображения(ПоказыватьРежимыФлажков);
	
	Если ТекущийРежимОтображения = Неопределено Тогда
		ПоказатьВыборИзМеню(Обработчик, ДоступныеРежимыОтображения);
	Иначе
		РежимОтображения = ДоступныеРежимыОтображения.НайтиПоЗначению(ТекущийРежимОтображения);
		ВыполнитьОбработкуОповещения(Обработчик, РежимОтображения);
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура ПослеВыбораРежимаОтображенияСтроки(РежимОтображения, Контекст) Экспорт
	
	Если РежимОтображения = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	Строка = ЭтотОбъект[Контекст.ИмяКоллекции].НайтиПоИдентификатору(Контекст.ИдентификаторСтроки); // см. ЭлементКоллекцииФормыНастроек
	Если Строка = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	ЭлементНастройки = Контекст.ОтборыУзлаНастроек.ПолучитьОбъектПоИдентификатору(Строка.Идентификатор);
	Если ЭлементНастройки = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	ДоступныеКартинки = ДоступныеКартинкиРежимовОтображения();
	КартинкаРежимаОтображения = ДоступныеКартинки[РежимОтображения.Значение];
	
	УстановитьРежимОтображения(Контекст.ИмяКоллекции, Строка, ЭлементНастройки, КартинкаРежимаОтображения);
	УстановитьМодифицированность();
	
КонецПроцедуры

&НаКлиенте
Функция ДоступныеРежимыОтображения(ПоказыватьРежимыФлажков)
	
	ДоступныеРежимыОтображения = Новый СписокЗначений;
	ДоступныеРежимыОтображения.Добавить("ПоказыватьВШапкеОтчета", НСтр("ru = 'В шапке отчета'"), , БиблиотекаКартинок.БыстрыйДоступ);
	
	Если ПоказыватьРежимыФлажков Тогда
		ДоступныеРежимыОтображения.Добавить("ПоказыватьТолькоФлажокВШапкеОтчета", НСтр("ru = 'Только флажок в шапке отчета'"), , БиблиотекаКартинок.БыстрыйДоступСФлажком);
	КонецЕсли;
	
	ДоступныеРежимыОтображения.Добавить("ПоказыватьВНастройкахОтчета", НСтр("ru = 'В настройках отчета'"), , БиблиотекаКартинок.Реквизит);
	
	Если ПоказыватьРежимыФлажков Тогда
		ДоступныеРежимыОтображения.Добавить("ПоказыватьТолькоФлажокВНастройкахОтчета", НСтр("ru = 'Только флажок в настройках отчета'"), , БиблиотекаКартинок.ОбычныйДоступСФлажком);
	КонецЕсли;
	
	ДоступныеРежимыОтображения.Добавить("НеПоказывать", НСтр("ru = 'Не показывать'"), , БиблиотекаКартинок.СерыйКрест);
	
	Возврат ДоступныеРежимыОтображения;
	
КонецФункции

&НаКлиенте
Функция ДоступныеКартинкиРежимовОтображения()
	
	ДоступныеКартинки = Новый Соответствие;
	ДоступныеКартинки.Вставить("ПоказыватьТолькоФлажокВШапкеОтчета", 1);
	ДоступныеКартинки.Вставить("ПоказыватьВШапкеОтчета", 2);
	ДоступныеКартинки.Вставить("ПоказыватьТолькоФлажокВНастройкахОтчета", 3);
	ДоступныеКартинки.Вставить("ПоказыватьВНастройкахОтчета", 4);
	ДоступныеКартинки.Вставить("НеПоказывать", 5);
	
	Возврат ДоступныеКартинки;
	
КонецФункции

// Параметры:
//  ИмяКоллекции - Строка
//  Строка - см. ЭлементКоллекцииФормыНастроек
//  ЭлементНастройки - см. ЭлементНастройки
//  КартинкаРежимаОтображения - Неопределено
//                            - Число
//
&НаКлиенте
Процедура УстановитьРежимОтображения(ИмяКоллекции, Строка, ЭлементНастройки, КартинкаРежимаОтображения = Неопределено)
	Если КартинкаРежимаОтображения = Неопределено Тогда
		КартинкаРежимаОтображения = Строка.КартинкаРежимаОтображения;
	Иначе
		Строка.КартинкаРежимаОтображения = КартинкаРежимаОтображения;
	КонецЕсли;
	
	Если КартинкаРежимаОтображения = 1 Или КартинкаРежимаОтображения = 2 Тогда
		ЭлементНастройки.РежимОтображения = РежимОтображенияЭлементаНастройкиКомпоновкиДанных.БыстрыйДоступ;
	ИначеЕсли КартинкаРежимаОтображения = 3 Или КартинкаРежимаОтображения = 4 Тогда
		ЭлементНастройки.РежимОтображения = РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Обычный;
	Иначе
		ЭлементНастройки.РежимОтображения = РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Недоступный;
	КонецЕсли;
	
	Если ИмяКоллекции = "Отборы" И Не Строка.ЭтоПараметр Тогда
		Если КартинкаРежимаОтображения = 1 Или КартинкаРежимаОтображения = 3 Тогда
			// Когда ПредставлениеПользовательскойНастройки заполнено,
			// то Представление работает как переключатель,
			// но также может использоваться для вывода в табличный документ.
			ЭлементНастройки.Представление = Строка.Заголовок;
		Иначе
			ЭлементНастройки.Представление = "";
		КонецЕсли;
		
		Если Не Строка.ЭтоПредопределенныйЗаголовок Тогда
			ЭлементНастройки.ПредставлениеПользовательскойНастройки = Строка.Заголовок;
		КонецЕсли;
	ИначеЕсли ИмяКоллекции = "Оформление" Тогда
		// Особенность УО - ПредставлениеПользовательскойНастройки может очищаться после ПолучитьНастройки().
		Если Строка.ЭтоПредопределенныйЗаголовок Тогда
			Если КартинкаРежимаОтображения = 1 Или КартинкаРежимаОтображения = 3 Тогда
				// Когда ПредставлениеПользовательскойНастройки заполнено,
				// то Представление работает как переключатель,
				// но также может использоваться для вывода в табличный документ.
				ЭлементНастройки.Представление = Строка.Заголовок;
			Иначе
				ЭлементНастройки.Представление = "";
			КонецЕсли;
		Иначе
			// Когда ПредставлениеПользовательскойНастройки заполнено,
			// то Представление работает как переключатель,
			// но также может использоваться для вывода в табличный документ.
			ЭлементНастройки.Представление = Строка.Заголовок;
		КонецЕсли;
	КонецЕсли;
	
	Если ЭлементНастройки.РежимОтображения = РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Недоступный Тогда
		ЭлементНастройки.ИдентификаторПользовательскойНастройки = "";
	ИначеЕсли Не ЗначениеЗаполнено(ЭлементНастройки.ИдентификаторПользовательскойНастройки) Тогда
		ЭлементНастройки.ИдентификаторПользовательскойНастройки = Новый УникальныйИдентификатор;
	КонецЕсли;
КонецПроцедуры

&НаКлиентеНаСервереБезКонтекста
Функция КартинкаРежимаОтображенияЭлементаНастройки(ЭлементНастройки)
	КартинкаРежимаОтображения = 5;
	
	Если ЗначениеЗаполнено(ЭлементНастройки.ИдентификаторПользовательскойНастройки) Тогда
		Если ЭлементНастройки.РежимОтображения = РежимОтображенияЭлементаНастройкиКомпоновкиДанных.БыстрыйДоступ Тогда
			Если ТипЗнч(ЭлементНастройки) = Тип("ЗначениеПараметраНастроекКомпоновкиДанных")
				Или ТипЗнч(ЭлементНастройки) = Тип("ЭлементУсловногоОформленияКомпоновкиДанных") Тогда 
				КартинкаРежимаОтображения = 2;
			Иначе
				КартинкаРежимаОтображения = ?(ЗначениеЗаполнено(ЭлементНастройки.Представление), 1, 2);
			КонецЕсли;
		ИначеЕсли ЭлементНастройки.РежимОтображения = РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Обычный Тогда
			Если ТипЗнч(ЭлементНастройки) = Тип("ЗначениеПараметраНастроекКомпоновкиДанных")
				Или ТипЗнч(ЭлементНастройки) = Тип("ЭлементУсловногоОформленияКомпоновкиДанных") Тогда 
				КартинкаРежимаОтображения = 4;
			Иначе
				КартинкаРежимаОтображения = ?(ЗначениеЗаполнено(ЭлементНастройки.Представление), 3, 4);
			КонецЕсли;
		КонецЕсли;
	КонецЕсли;
	
	Возврат КартинкаРежимаОтображения;
КонецФункции

////////////////////////////////////////////////////////////////////////////////
// Клиент - Таблицы полей (функциональная часть).

// Параметры:
//  УзелНастроек - НастройкиКомпоновкиДанных
//               - НастройкиВложенногоОбъектаКомпоновкиДанных
//               - СтруктураНастроекКомпоновкиДанных
//               - ДиаграммаКомпоновкиДанных
//               - ПорядокКомпоновкиДанных
//               - ГруппировкаКомпоновкиДанных
//               - ГруппировкаТаблицыКомпоновкиДанных
//               - ГруппировкаДиаграммыКомпоновкиДанных
//               - УсловноеОформлениеКомпоновкиДанных
//               - ГруппаВыбранныхПолейКомпоновкиДанных
//               - ГруппаЭлементовОтбораКомпоновкиДанных
//               - ЭлементОтбораКомпоновкиДанных
//               - ЭлементУсловногоОформленияКомпоновкиДанных
//               - ЗначенияПараметровВыводаКомпоновкиДанных
//               - ЗначениеПараметраНастроекКомпоновкиДанных
//               - ОтборКомпоновкиДанных
//               - ВыбранныеПоляКомпоновкиДанных
//               - ТаблицаКомпоновкиДанных
//               - Неопределено
//  Строка - см. ЭлементКоллекцииФормыНастроек
//
// Возвращаемое значение:
//   - НастройкиКомпоновкиДанных
//   - НастройкиВложенногоОбъектаКомпоновкиДанных
//   - СтруктураНастроекКомпоновкиДанных
//   - ГруппировкаКомпоновкиДанных
//   - ТаблицаКомпоновкиДанных
//   - КоллекцияЭлементовСтруктурыТаблицыКомпоновкиДанных
//   - ГруппировкаТаблицыКомпоновкиДанных
//   - ДиаграммаКомпоновкиДанных
//   - КоллекцияЭлементовСтруктурыДиаграммыКомпоновкиДанных
//   - ГруппировкаДиаграммыКомпоновкиДанных
//   - ОтборКомпоновкиДанных
//   - ЭлементОтбораКомпоновкиДанных
//   - ГруппаЭлементовОтбораКомпоновкиДанных
//   - ЭлементУсловногоОформленияКомпоновкиДанных
//   - ЗначенияПараметровВыводаКомпоновкиДанных
//   - ЗначениеПараметраНастроекКомпоновкиДанных
//   - ВыбранныеПоляКомпоновкиДанных
//   - ГруппаВыбранныхПолейКомпоновкиДанных
//   - ПорядокКомпоновкиДанных
//   - УсловноеОформлениеКомпоновкиДанных
//   - КоллекцияЭлементовУсловногоОформленияКомпоновкиДанных
//   - Неопределено
//
&НаКлиентеНаСервереБезКонтекста
Функция ЭлементНастройки(Знач УзелНастроек, Знач Строка)
	ЭлементНастройки = Неопределено;
	
	Если Строка <> Неопределено
		И ТипЗнч(Строка.Идентификатор) = Тип("ИдентификаторКомпоновкиДанных") Тогда
		
		ЭлементНастройки = УзелНастроек.ПолучитьОбъектПоИдентификатору(Строка.Идентификатор);
	КонецЕсли;
	
	Если ТипЗнч(ЭлементНастройки) = Тип("НастройкиВложенногоОбъектаКомпоновкиДанных") Тогда
		ЭлементНастройки = ЭлементНастройки.Настройки;
	КонецЕсли;
	
	Возврат ЭлементНастройки;
КонецФункции

&НаКлиентеНаСервереБезКонтекста
Функция ЭлементыНастроек(Знач СвойствоЭлементаСтруктуры, Знач ЭлементНастройки = Неопределено, Знач ИмяКоллекции = Неопределено)
	Если ЭлементНастройки = Неопределено Тогда
		ЭлементНастройки = СвойствоЭлементаСтруктуры;
	КонецЕсли;
	
	ТипОбъекта = ТипЗнч(ЭлементНастройки);
	
	Если ИмяКоллекции <> Неопределено Тогда 
		ИмяКоллекции = СтрЗаменить(ИмяКоллекции, "Таблица", "");
		ИмяКоллекции = СтрЗаменить(ИмяКоллекции, "Диаграмма", "");
		
		Если ТипОбъекта = Тип("ТаблицаКомпоновкиДанных")
			И (ИмяКоллекции = "Строки" Или ИмяКоллекции = "Колонки")
			Или ТипОбъекта = Тип("ДиаграммаКомпоновкиДанных")
			И (ИмяКоллекции = "Серии" Или ИмяКоллекции = "Точки") Тогда 
			
			Возврат ЭлементНастройки[ИмяКоллекции];
		КонецЕсли;
	КонецЕсли;
	
	Если ТипОбъекта = Тип("НастройкиКомпоновкиДанных")
		Или ТипОбъекта = Тип("ГруппировкаКомпоновкиДанных")
		Или ТипОбъекта = Тип("ГруппировкаТаблицыКомпоновкиДанных")
		Или ТипОбъекта = Тип("ГруппировкаДиаграммыКомпоновкиДанных") Тогда
		
		Возврат ЭлементНастройки.Структура;
	ИначеЕсли ТипОбъекта = Тип("КоллекцияЭлементовСтруктурыНастроекКомпоновкиДанных")
		Или ТипОбъекта = Тип("КоллекцияЭлементовСтруктурыТаблицыКомпоновкиДанных")
		Или ТипОбъекта = Тип("КоллекцияЭлементовСтруктурыДиаграммыКомпоновкиДанных") Тогда
		
		Возврат ЭлементНастройки;
	ИначеЕсли ТипОбъекта = Тип("НастройкиВложенногоОбъектаКомпоновкиДанных") Тогда 
		
		Возврат ЭлементНастройки.Настройки.Структура;
	КонецЕсли;
	
	Возврат ЭлементНастройки.Элементы;
КонецФункции

&НаКлиенте
Функция ИмяКоллекцииНастроекПоИдентификатору(Идентификатор)
	ИмяКоллекции = Неопределено;
	
	Путь = ВРег(Идентификатор);
	Если СтрНайти(Путь, "SERIES") > 0 Тогда 
		ИмяКоллекции = "Серии";
	ИначеЕсли СтрНайти(Путь, "POINT") > 0 Тогда 
		ИмяКоллекции = "Точки";
	ИначеЕсли СтрНайти(Путь, "ROW") > 0 Тогда 
		ИмяКоллекции = "Строки";
	ИначеЕсли СтрНайти(Путь, "COLUMN") > 0 Тогда 
		ИмяКоллекции = "Колонки";
	КонецЕсли;
	
	Возврат ИмяКоллекции;
КонецФункции

&НаКлиенте
Функция ПолучитьРодителяЭлементаНастройки(Знач СвойствоЭлементаСтруктуры, Знач ЭлементНастройки)
	Родитель = Неопределено;
	
	ТипЭлемента = ТипЗнч(ЭлементНастройки);
	Если ЭлементНастройки <> Неопределено
		И ТипЭлемента <> Тип("ПолеГруппировкиКомпоновкиДанных")
		И ТипЭлемента <> Тип("АвтоПолеГруппировкиКомпоновкиДанных")
		И ТипЭлемента <> Тип("АвтоЭлементПорядкаКомпоновкиДанных")
		И ТипЭлемента <> Тип("ЭлементПорядкаКомпоновкиДанных")
		И ТипЭлемента <> Тип("ЭлементУсловногоОформленияКомпоновкиДанных")
		И ТипЭлемента <> Тип("КоллекцияЭлементовСтруктурыТаблицыКомпоновкиДанных") Тогда 
		Родитель = ЭлементНастройки.Родитель;
	КонецЕсли;
	
	Если Родитель = Неопределено Тогда 
		Родитель = СвойствоЭлементаСтруктуры;
	КонецЕсли;
	
	Возврат Родитель;
КонецФункции

&НаКлиентеНаСервереБезКонтекста
Функция ПолучитьЭлементы(Знач Дерево, Знач Строка)
	Если Строка = Неопределено Тогда
		Строка = Дерево;
	КонецЕсли;
	Возврат Строка.ПолучитьЭлементы();
КонецФункции

&НаКлиенте
Функция ПолучитьРодителя(Знач ИмяКоллекции, Знач Строка = Неопределено)
	Родитель = Неопределено;
	
	Если Строка <> Неопределено Тогда
		Родитель = Строка.ПолучитьРодителя();
	КонецЕсли;
	
	Если Родитель = Неопределено Тогда
		Родитель = КорневаяСтрокаПоУмолчанию(ИмяКоллекции);
	КонецЕсли;
	
	Если Родитель = Неопределено Тогда
		Родитель = ЭтотОбъект[ИмяКоллекции];
	КонецЕсли;
	
	Возврат Родитель;
КонецФункции

&НаКлиенте
Функция КорневаяСтрокаПоУмолчанию(Знач ИмяКоллекции)
	КорневаяСтрока = Неопределено;
	
	Если ИмяКоллекции = "ВыбранныеПоля" Тогда
		КорневаяСтрока = ВыбранныеПоля.ПолучитьЭлементы()[0];
	ИначеЕсли ИмяКоллекции = "Сортировка" Тогда
		КорневаяСтрока = Сортировка.ПолучитьЭлементы()[0];
	ИначеЕсли ИмяКоллекции = "СтруктураВарианта" Тогда
		КорневаяСтрока = СтруктураВарианта.ПолучитьЭлементы()[0];
	ИначеЕсли ИмяКоллекции = "Параметры" Тогда
		Если Не РежимИзмененияЭлементаСтруктурыНастроек Тогда
			КорневаяСтрока = Отборы.ПолучитьЭлементы()[0];
		КонецЕсли;
	ИначеЕсли ИмяКоллекции = "Отборы" Тогда
		Если РежимИзмененияЭлементаСтруктурыНастроек Тогда
			КорневаяСтрока = Отборы.ПолучитьЭлементы()[0];
		Иначе
			КорневаяСтрока = Отборы.ПолучитьЭлементы()[1];
		КонецЕсли;
	ИначеЕсли ИмяКоллекции = "Оформление" Тогда
		Если Не РежимИзмененияЭлементаСтруктурыНастроек Тогда 
			КорневаяСтрока = Оформление;
		КонецЕсли;
	КонецЕсли;
	
	Возврат КорневаяСтрока;
КонецФункции

&НаКлиенте
Процедура ВыбратьПоле(ИмяКоллекции, Обработчик, Поле = Неопределено, ИдентификаторУзлаНастроек = Неопределено)
	ПараметрыВыбора = Новый Структура;
	ПараметрыВыбора.Вставить("НастройкиОтчета", НастройкиОтчета);
	ПараметрыВыбора.Вставить("КомпоновщикНастроек", Отчет.КомпоновщикНастроек);
	ПараметрыВыбора.Вставить("Режим", ИмяКоллекции);
	ПараметрыВыбора.Вставить("ПолеКД", Поле);
	ПараметрыВыбора.Вставить("ИдентификаторЭлементаСтруктурыНастроек", 
		?(ИдентификаторУзлаНастроек = Неопределено, ИдентификаторЭлементаСтруктурыНастроек, ИдентификаторУзлаНастроек));
	
	ОткрытьФорму(
		"ХранилищеНастроек.ХранилищеВариантовОтчетов.Форма.ВыборПоляОтчета",
		ПараметрыВыбора, ЭтотОбъект, УникальныйИдентификатор,,, Обработчик, РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);
КонецПроцедуры

&НаКлиенте
Процедура ОбновитьЗаголовокЭлементаСтруктурыВарианта(Строка)
	СвойствоЭлементаСтруктуры = СвойствоЭлементаСтруктурыНастроек(Отчет.КомпоновщикНастроек, "Структура");
	
	ЭлементНастройки = ЭлементНастройки(СвойствоЭлементаСтруктуры, Строка);
	Если ЭлементНастройки = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	ЗначениеПараметра = ЭлементНастройки.ПараметрыВывода.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных("ВыводитьЗаголовок"));
	Если ЗначениеПараметра <> Неопределено Тогда
		ЗначениеПараметра.Использование = Истина;
		Если ЗначениеЗаполнено(Строка.Заголовок) Тогда
			ЗначениеПараметра.Значение = ТипВыводаТекстаКомпоновкиДанных.Выводить;
		Иначе
			ЗначениеПараметра.Значение = ТипВыводаТекстаКомпоновкиДанных.НеВыводить;
		КонецЕсли;
	КонецЕсли;
	
	ЗначениеПараметра = ЭлементНастройки.ПараметрыВывода.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных("Заголовок"));
	Если ЗначениеПараметра <> Неопределено Тогда
		ЗначениеПараметра.Использование = Истина;
		ЗначениеПараметра.Значение = Строка.Заголовок;
	КонецЕсли;
КонецПроцедуры

////////////////////////////////////////////////////////////////////////////////
// Клиент или сервер

&НаКлиентеНаСервереБезКонтекста
Функция МассивСортировать(ИсходныйМассив, Направление = Неопределено)
	Если Направление = Неопределено Тогда 
		Направление = НаправлениеСортировки.Возр;
	КонецЕсли;
	
	Список = Новый СписокЗначений;
	Список.ЗагрузитьЗначения(ИсходныйМассив);
	Список.СортироватьПоЗначению(Направление);
	
	Возврат Список.ВыгрузитьЗначения();
КонецФункции

////////////////////////////////////////////////////////////////////////////////
// Вызов сервера

&НаСервере
Процедура ОбновитьФорму(ПараметрыОбновления = Неопределено)
	СодержитВложенныеОтчеты = Ложь;
	СодержитВложенныеОтборы = Ложь;
	СодержитВложенныеПоляИлиСортировки = Ложь;
	СодержитВложенноеУсловноеОформление = Ложь;
	СодержитПользовательскиеЭлементыСтруктуры = Ложь;
	
	ЗагрузитьНастройкиВКомпоновщик(ПараметрыОбновления);
	
	Если РасширенныйРежим = 0 Тогда 
		ОтчетыСервер.ОбновитьЭлементыФормыНастроек(ЭтотОбъект, Элементы.Основное, ПараметрыОбновления);
		ОтчетыСервер.ВосстановитьЗначенияОтборов(ЭтотОбъект);
	КонецЕсли;
	
	ОбновитьКоллекцииФормыНастроек();
	
	УстановитьТипДиаграммы();
	ОбновитьСвойстваЭлементовФормы();
КонецПроцедуры

&НаСервере
Процедура ОбновитьКоллекцииФормыНастроек()
	// Очистка настроек.
	СоставГруппировки.ПолучитьЭлементы().Очистить();
	Отборы.ПолучитьЭлементы().Очистить();
	ВыбранныеПоля.ПолучитьЭлементы().Очистить();
	Сортировка.ПолучитьЭлементы().Очистить();
	Оформление.ПолучитьЭлементы().Очистить();
	СтруктураВарианта.ПолучитьЭлементы().Очистить();
	
	УстановитьТипДиаграммы();
	
	// Обновление настроек.
	ОбновитьПоляГруппировки();
	ОбновитьПараметрыДанных();
	ОбновитьОтборы();
	ОбновитьВыбранныеПоля();
	ОбновитьСортировку();
	ОбновитьОформление();
	ОбновитьСтруктуру();
	
	// Поиск помеченных на удаление.
	ПомеченныеНаУдаление.Очистить();
	НайтиПомеченныеНаУдалениеПоля();
КонецПроцедуры

&НаСервере
Процедура УстановитьТипДиаграммы()
	Элементы.ТекущийТипДиаграммы.Видимость = Ложь;
	
	Если ТипЭлементаСтруктурыНастроек <> "ДиаграммаКомпоновкиДанных" Тогда
		Возврат;
	КонецЕсли;
	
	Элементы.ТекущийТипДиаграммы.ОграничениеТипа = Новый ОписаниеТипов("ТипДиаграммы");
	
	ЭлементСтруктуры = Отчет.КомпоновщикНастроек.Настройки.ПолучитьОбъектПоИдентификатору(ИдентификаторЭлементаСтруктурыНастроек);
	Если ТипЗнч(ЭлементСтруктуры) = Тип("НастройкиВложенногоОбъектаКомпоновкиДанных") Тогда
		ЭлементСтруктуры = ЭлементСтруктуры.Настройки;
	КонецЕсли;
	
	ЭлементНастройки = ЭлементСтруктуры.ПараметрыВывода.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных("ТипДиаграммы"));
	Если ЭлементНастройки <> Неопределено Тогда
		ТекущийТипДиаграммы = ЭлементНастройки.Значение;
	КонецЕсли;
	
	Элементы.ТекущийТипДиаграммы.Видимость = (ЭлементНастройки <> Неопределено);
КонецПроцедуры

&НаСервере
Процедура ОбновитьСвойстваЭлементовФормы()
	КомпоновщикНастроек = Отчет.КомпоновщикНастроек;
	
	#Область ОбщиеПризнакиСвойствЭлементов
	
	ЭтоРасширенныйРежим = Булево(РасширенныйРежим);
	ОтображатьИнформацию = ЭтоРасширенныйРежим И Не РежимИзмененияЭлементаСтруктурыНастроек;
	
	#КонецОбласти
	
	#Область СвойстваЭлементовПростогоРежимаРедактирования
	
	Элементы.Основное.Видимость = Не ЭтоРасширенныйРежим;
	Элементы.Дополнительно.Видимость = Не ЭтоРасширенныйРежим И Не ЭтоМобильныйКлиент;
	
	Элементы.ВыводитьЗаголовок.Видимость = Не ЭтоРасширенныйРежим;
	Элементы.ВыводитьФильтры.Видимость = Не ЭтоРасширенныйРежим;
	
	#КонецОбласти
	
	#Область СвойстваЭлементовСтраницыСоставГруппировки
	
	ОтображатьСоставГруппировки = (ЭтоРасширенныйРежим
		И РежимИзмененияЭлементаСтруктурыНастроек
		И ТипЭлементаСтруктурыНастроек <> "ДиаграммаКомпоновкиДанных");
	
	Элементы.СтраницаСоставГруппировки.Видимость = ОтображатьСоставГруппировки;
	Элементы.КомандыСоставаГруппировки.Видимость = ОтображатьСоставГруппировки;
	Элементы.СоставГруппировки.Видимость = ОтображатьСоставГруппировки;
	
	#КонецОбласти
	
	#Область СвойстваЭлементовСтраницыОтборы
	
	ОтображатьОтборы = (ЭтоРасширенныйРежим
		И ТипЭлементаСтруктурыНастроек <> "ДиаграммаКомпоновкиДанных");
	
	Если ЭтоРасширенныйРежим Тогда
		Элементы.СтраницаОтборы.Заголовок = НСтр("ru = 'Фильтры'");
	Иначе
		Элементы.СтраницаОтборы.Заголовок = НСтр("ru = 'Основное'");
		Если ЭтоМобильныйКлиент Тогда
			ГруппаПользовательскиеНастройкиОсновные = Элементы.Основное.ПодчиненныеЭлементы.Найти("КомпоновщикНастроекПользовательскиеНастройкиОсновные");
			Если ГруппаПользовательскиеНастройкиОсновные <> Неопределено Тогда
				Если Элементы.Основное.ПодчиненныеЭлементы.Количество() = 1
					И Элементы.Основное.Вид = ВидГруппыФормы.Страницы Тогда // ГруппаФормы
					Элементы.Основное.ОтображениеСтраниц = ОтображениеСтраницФормы.Нет;
				Иначе
					Для Каждого ПодчиненныйЭлемент Из Элементы.Основное.ПодчиненныеЭлементы Цикл
						Если ПодчиненныйЭлемент = ГруппаПользовательскиеНастройкиОсновные Тогда
							Продолжить;
						КонецЕсли;
						Для Каждого ПодчиненныйЭлемент1 Из ПодчиненныйЭлемент.ПодчиненныеЭлементы Цикл
							Если ТипЗнч(ПодчиненныйЭлемент1) = Тип("ТаблицаФормы") Тогда
								ПодчиненныйЭлемент1.ПоложениеКоманднойПанели = ПоложениеКоманднойПанелиЭлементаФормы.Нет;
								ПодчиненныйЭлемент1.Шапка = Ложь;
							КонецЕсли;
						КонецЦикла;
					КонецЦикла;
				КонецЕсли;
				Если ГруппаПользовательскиеНастройкиОсновные.ПодчиненныеЭлементы.Найти(ГруппаПользовательскиеНастройкиОсновные.Имя+"1") = Неопределено Тогда
					ГруппаПользовательскиеНастройкиОсновные1 = Элементы.Добавить(ГруппаПользовательскиеНастройкиОсновные.Имя+"1", Тип("ГруппаФормы"), ГруппаПользовательскиеНастройкиОсновные);
					ГруппаПользовательскиеНастройкиОсновные1.Вид = ВидГруппыФормы.ОбычнаяГруппа; // ГруппаФормы
					ГруппаПользовательскиеНастройкиОсновные1.ОтображатьЗаголовок = Ложь;
					ГруппаПользовательскиеНастройкиОсновные1.ГоризонтальныйИнтервал = ИнтервалМеждуЭлементамиФормы.Нет;
					ГруппаПользовательскиеНастройкиОсновные1.ВертикальныйИнтервал = ИнтервалМеждуЭлементамиФормы.Нет;
					Счетчик = 0;
					Пока Счетчик < ГруппаПользовательскиеНастройкиОсновные.ПодчиненныеЭлементы.Количество() Цикл
						ПодчиненныйЭлемент = ГруппаПользовательскиеНастройкиОсновные.ПодчиненныеЭлементы[Счетчик];
						Если ПодчиненныйЭлемент = ГруппаПользовательскиеНастройкиОсновные1 Тогда
							Счетчик = Счетчик + 1;
						Иначе
							Если ТипЗнч(ПодчиненныйЭлемент) = Тип("ГруппаФормы") Тогда
								ПодчиненныйЭлемент.Объединенная = Ложь;
							КонецЕсли;
							Элементы.Переместить(ПодчиненныйЭлемент, ГруппаПользовательскиеНастройкиОсновные1);
						КонецЕсли;
					КонецЦикла;
				КонецЕсли;
			КонецЕсли;
		КонецЕсли;
	КонецЕсли;
	
	Элементы.Отборы.Видимость = ОтображатьОтборы;
	Элементы.ГруппаЕстьВложенныеОтборы.Видимость = ОтображатьОтборы
		И СодержитВложенныеОтборы
		И ОтображатьИнформацию;
	
	Элементы.ОтборыПерейтиКНастройкамДляТехническогоСпециалиста.Видимость = ЭтоРасширенныйРежим
		И Не РежимИзмененияЭлементаСтруктурыНастроек;
	
	#КонецОбласти
	
	#Область СвойстваЭлементовСтраницыПоляИСортировки
	
	СвойствоЭлементаСтруктуры = СвойствоЭлементаСтруктурыНастроек(
		КомпоновщикНастроек, "Выбор", ИдентификаторЭлементаСтруктурыНастроек, РасширенныйРежим);
	ОтображатьВыбранныеПоля =
		СвойствоЭлементаСтруктуры <> Неопределено
		И (ЗначениеЗаполнено(СвойствоЭлементаСтруктуры.ИдентификаторПользовательскойНастройки) Или ЭтоРасширенныйРежим);
	
	СвойствоЭлементаСтруктуры = СвойствоЭлементаСтруктурыНастроек(
		КомпоновщикНастроек, "Порядок", ИдентификаторЭлементаСтруктурыНастроек, РасширенныйРежим);
	ОтображатьСортировки =
		ТипЭлементаСтруктурыНастроек <> "ДиаграммаКомпоновкиДанных"
		И СвойствоЭлементаСтруктуры <> Неопределено
		И (ЗначениеЗаполнено(СвойствоЭлементаСтруктуры.ИдентификаторПользовательскойНастройки) Или ЭтоРасширенныйРежим);
	
	Если ОтображатьВыбранныеПоля И ОтображатьСортировки Тогда
		Элементы.СтраницаВыбранныеПоляИСортировки.Заголовок = НСтр("ru = 'Поля и сортировки'");
	ИначеЕсли ОтображатьВыбранныеПоля Тогда
		Элементы.СтраницаВыбранныеПоляИСортировки.Заголовок = НСтр("ru = 'Поля'");
	ИначеЕсли ОтображатьСортировки Тогда
		Элементы.СтраницаВыбранныеПоляИСортировки.Заголовок = НСтр("ru = 'Сортировки'");
	КонецЕсли;
	
	Элементы.ВыбранныеПоля.Видимость = ОтображатьВыбранныеПоля;
	Элементы.КомандыВыбранныхПолей_ДобавлениеУдаление.Видимость = ОтображатьВыбранныеПоля И ЭтоРасширенныйРежим;
	Элементы.КомандыВыбранныхПолей_ДобавлениеУдаление1.Видимость = ОтображатьВыбранныеПоля И ЭтоРасширенныйРежим;
	Элементы.КомандыВыбранныхПолей_Группы.Видимость = ОтображатьВыбранныеПоля И ЭтоРасширенныйРежим;
	Элементы.КомандыВыбранныхПолей_Группы1.Видимость = ОтображатьВыбранныеПоля И ЭтоРасширенныйРежим;
	
	Элементы.КомандыПолейИСортировок.Видимость = ОтображатьВыбранныеПоля И ОтображатьСортировки;
	
	Элементы.Сортировка.Видимость = ОтображатьСортировки;
	Элементы.КомандыСортировки_ДобавлениеУдаление.Видимость = ОтображатьСортировки И ЭтоРасширенныйРежим;
	Элементы.КомандыСортировки_ДобавлениеУдаление1.Видимость = ОтображатьСортировки И ЭтоРасширенныйРежим;
	
	Элементы.ГруппаЕстьВложенныеПоляИлиСортировки.Видимость = СодержитВложенныеПоляИлиСортировки И ОтображатьИнформацию;
	
	Элементы.ВыбранныеПоляПерейтиКНастройкамДляТехническогоСпециалиста.Видимость = ЭтоРасширенныйРежим
		И Не РежимИзмененияЭлементаСтруктурыНастроек;
	
	#КонецОбласти
	
	#Область СвойстваЭлементовСтраницыОформление
	
	ОтображатьОформление = ЭтоРасширенныйРежим;
	Элементы.Оформление.Видимость = ОтображатьОформление;
	Элементы.ГруппаЕстьВложенноеОформление.Видимость = ОтображатьОформление
		И СодержитВложенноеУсловноеОформление
		И ОтображатьИнформацию;
	
	Элементы.ОформлениеПерейтиКНастройкамДляТехническогоСпециалиста.Видимость = ЭтоРасширенныйРежим
		И Не РежимИзмененияЭлементаСтруктурыНастроек;
	
	#КонецОбласти
	
	#Область СвойстваЭлементовСтраницыСтруктураВарианта
	
	ОтображатьСтруктуруВарианта =
		НастройкиОтчета.РазрешеноИзменятьСтруктуру
		И Не РежимИзмененияЭлементаСтруктурыНастроек
		И (СодержитПользовательскиеЭлементыСтруктуры Или ЭтоРасширенныйРежим);
	
	Элементы.СтраницаСтруктураВарианта.Видимость = ОтображатьСтруктуруВарианта;
	
	Элементы.КомандыСтруктурыВарианта_Добавление.Видимость = ЭтоРасширенныйРежим;
	Элементы.КомандыСтруктурыВарианта_Добавление1.Видимость = ЭтоРасширенныйРежим;
	Элементы.КомандыСтруктурыВарианта_Изменение.Видимость = ЭтоРасширенныйРежим;
	Элементы.КомандыСтруктурыВарианта_Изменение1.Видимость = ЭтоРасширенныйРежим;
	Элементы.КомандыСтруктурыВарианта_ДвижениеПоИерархии.Видимость = ЭтоРасширенныйРежим;
	Элементы.КомандыСтруктурыВарианта_ДвижениеПоИерархии1.Видимость = ЭтоРасширенныйРежим;
	Элементы.КомандыСтруктурыВарианта_ДвижениеВнутриРодителя.Видимость = ЭтоРасширенныйРежим;
	Элементы.КомандыСтруктурыВарианта_ДвижениеВнутриРодителя1.Видимость = ЭтоРасширенныйРежим;
	Элементы.КомандыСтруктурыВарианта_ДвижениеВИерархии.Видимость = ЭтоРасширенныйРежим;
	Элементы.КомандыСтруктурыВарианта_ДвижениеВИерархии1.Видимость = ЭтоРасширенныйРежим;
	
	Элементы.СтруктураВарианта.ИзменятьСоставСтрок = ЭтоРасширенныйРежим;
	Элементы.СтруктураВарианта.ИзменятьПорядокСтрок = ЭтоРасширенныйРежим;
	Элементы.СтруктураВарианта.РазрешитьНачалоПеретаскивания = ЭтоРасширенныйРежим;
	Элементы.СтруктураВарианта.РазрешитьПеретаскивание = ЭтоРасширенныйРежим;
	Элементы.СтруктураВарианта.Шапка = ЭтоРасширенныйРежим;
	
	Элементы.СтруктураВариантаЗаголовок.Видимость = ЭтоРасширенныйРежим;
	
	Элементы.СтруктураВариантаСодержитОтборы.Видимость = ЭтоРасширенныйРежим;
	Элементы.СтруктураВариантаСодержитПоляИлиСортировки.Видимость = ЭтоРасширенныйРежим;
	Элементы.СтруктураВариантаСодержитУсловноеОформление.Видимость = ЭтоРасширенныйРежим;
	
	Элементы.СтруктураВариантаПерейтиКНастройкамДляТехническогоСпециалиста.Видимость = ЭтоРасширенныйРежим
		И Не РежимИзмененияЭлементаСтруктурыНастроек;
	
	#КонецОбласти
	
	#Область ОбщиеСвойстваЭлементов
	
	Если Параметры.Свойство("ОтображатьСтраницы") Тогда 
		ОтображатьСтраницы = (Параметры.ОтображатьСтраницы <> Ложь);
	ИначеЕсли Не ЭтоРасширенныйРежим Тогда 
		ОтображатьСтраницы = Ложь;
	Иначе
		ОтображатьСтраницы =
			ОтображатьСоставГруппировки
			Или ОтображатьОтборы
			Или ОтображатьВыбранныеПоля
			Или ОтображатьСортировки
			Или ОтображатьОформление
			Или ОтображатьСтруктуруВарианта;
	КонецЕсли;
	
	Если ОтображатьСтраницы Тогда 
		Элементы.СтраницыНастроек.ОтображениеСтраниц = ОтображениеСтраницФормы.ЗакладкиСверху;
	Иначе
		Элементы.СтраницыНастроек.ТекущаяСтраница = Элементы.СтраницаОтборы;
		Элементы.СтраницыНастроек.ОтображениеСтраниц = ОтображениеСтраницФормы.Нет;
	КонецЕсли;
	
	Элементы.ГруппаЕстьВложенныеОтчеты.Видимость = СодержитВложенныеОтчеты И ОтображатьИнформацию;
	Элементы.ГруппаЕстьНесуществующиеПоля.Видимость =  ПомеченныеНаУдаление.Количество() > 0 И ОтображатьИнформацию;
	
	Элементы.РасширенныйРежим.Видимость = НастройкиОтчета.РазрешеноИзменятьВарианты И Не РежимИзмененияЭлементаСтруктурыНастроек;
	Элементы.ИзменитьУсловияОтборов.Видимость = РазрешитьИзменятьУсловияОтборов();
	
	Если РежимИзмененияЭлементаСтруктурыНастроек Тогда
		Элементы.ЗакрытьИСформировать.Заголовок = НСтр("ru = 'Завершить редактирование'");
		Элементы.Закрыть.Заголовок = НСтр("ru = 'Отмена'");
	Иначе
		Элементы.ЗакрытьИСформировать.Заголовок = НСтр("ru = 'Закрыть и сформировать'");
		Элементы.Закрыть.Заголовок = НСтр("ru = 'Закрыть'");
	КонецЕсли;
	
	КоличествоДоступныхНастроек = ОтчетыСервер.КоличествоДоступныхНастроек(Отчет.КомпоновщикНастроек);
	Элементы.ЗакрытьИСформировать.Видимость = КоличествоДоступныхНастроек.Итог > 0 Или ОтображатьСтраницы;
	Если ЭтоМобильныйКлиент Тогда
		Элементы.РасширенныйРежим.Видимость = Ложь;
		Элементы.ГруппаНастройка.Видимость = Ложь;
		Элементы.ГруппаЕстьВложенныеОтчеты.Видимость = Истина;
		Элементы.ПодсказкаЕстьВложенныеОтчеты.Заголовок = НСтр(
			"ru='Расширенный режим настройки недоступен в мобильном клиенте'");
		Элементы.ЗакрытьИСформировать.Отображение = ОтображениеКнопки.КартинкаИТекст;
		Элементы.Закрыть.Видимость = Ложь;
		Элементы.Справка.Видимость = Ложь;
	КонецЕсли;
	
	#КонецОбласти
КонецПроцедуры

////////////////////////////////////////////////////////////////////////////////
// Сервер

&НаСервере
Процедура ОпределитьПоведениеВМобильномКлиенте()
	ЭтоМобильныйКлиент = ОбщегоНазначения.ЭтоМобильныйКлиент();
	Если Не ЭтоМобильныйКлиент Тогда 
		Возврат;
	КонецЕсли;
	
	ПоложениеКоманднойПанели = ПоложениеКоманднойПанелиФормы.Авто;
	Элементы.ЗакрытьИСформировать.Отображение = ОтображениеКнопки.Картинка;
КонецПроцедуры

&НаСервере
Процедура УстановитьУсловноеОформление()
	УсловноеОформление.Элементы.Очистить();
	
	#Область УсловноеОформлениеТаблицыФормыСоставГруппировки
	
	//
	Элемент = УсловноеОформление.Элементы.Добавить();
	
	ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("СоставГруппировки.ПоказыватьТипДополнения");
	ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
	ОтборЭлемента.ПравоеЗначение = Истина;
	
	Элемент.Оформление.УстановитьЗначениеПараметра("Видимость", Ложь);
	Элемент.Оформление.УстановитьЗначениеПараметра("Отображать", Ложь);
	
	ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
	ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.СоставГруппировкиТипГруппировки.Имя);
	
	//
	Элемент = УсловноеОформление.Элементы.Добавить();
	
	ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("СоставГруппировки.ПоказыватьТипДополнения");
	ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
	ОтборЭлемента.ПравоеЗначение = Ложь;
	
	Элемент.Оформление.УстановитьЗначениеПараметра("Видимость", Ложь);
	Элемент.Оформление.УстановитьЗначениеПараметра("Отображать", Ложь);
	
	ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
	ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.СоставГруппировкиТипДополнения.Имя);
	
	//
	Элемент = УсловноеОформление.Элементы.Добавить();
	
	ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("СоставГруппировки.Поле");
	ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
	ОтборЭлемента.ПравоеЗначение = Неопределено;
	
	Элемент.Оформление.УстановитьЗначениеПараметра("Видимость", Ложь);
	Элемент.Оформление.УстановитьЗначениеПараметра("Отображать", Ложь);
	
	ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
	ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.СоставГруппировкиТипГруппировки.Имя);
	
	//
	Элемент = УсловноеОформление.Элементы.Добавить();
	
	ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("СоставГруппировки.Заголовок");
	ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Заполнено;
	
	Элемент.Оформление.УстановитьЗначениеПараметра("Текст", Новый ПолеКомпоновкиДанных("СоставГруппировки.Заголовок"));
	
	ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
	ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.СоставГруппировкиПоле.Имя);
	
	#КонецОбласти
	
	#Область УсловноеОформлениеТаблицыФормыОтборы
	
	//
	Элемент = УсловноеОформление.Элементы.Добавить();
	
	ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Отборы.ЭтоРаздел");
	ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
	ОтборЭлемента.ПравоеЗначение = Истина;
	
	Элемент.Оформление.УстановитьЗначениеПараметра("ТолькоПросмотр", Истина);
	
	ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
	ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ОтборыПараметр.Имя);
	ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
	ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ОтборыВидСравнения.Имя);
	ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
	ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ОтборыЗначение.Имя);
	ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
	ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ОтборыКартинкаРежимаОтображения.Имя);
	ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
	ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ОтборыПредставлениеПользовательскойНастройки.Имя);
	
	//
	Элемент = УсловноеОформление.Элементы.Добавить();
	
	ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Отборы.ЭтоРаздел");
	ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
	ОтборЭлемента.ПравоеЗначение = Истина;
	
	Элемент.Оформление.УстановитьЗначениеПараметра("Видимость", Ложь);
	
	ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
	ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ОтборыТипГруппы.Имя);
	ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
	ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ОтборыПоле.Имя);
	ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
	ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ОтборыПравоеЗначение.Имя);
	
	//
	Элемент = УсловноеОформление.Элементы.Добавить();
	
	ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Отборы.ЭтоРаздел");
	ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
	ОтборЭлемента.ПравоеЗначение = Истина;
	
	Элемент.Оформление.УстановитьЗначениеПараметра("Отображать", Ложь);
	
	ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
	ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ОтборыИспользование.Имя);
	ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
	ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ОтборыТипГруппы.Имя);
	ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
	ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ОтборыПоле.Имя);
	ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
	ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ОтборыВидСравнения.Имя);
	ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
	ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ОтборыЗначение.Имя);
	ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
	ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ОтборыКартинкаРежимаОтображения.Имя);
	ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
	ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ОтборыПредставлениеПользовательскойНастройки.Имя);
	
	//
	Элемент = УсловноеОформление.Элементы.Добавить();
	
	ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Отборы.ЭтоПараметр");
	ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
	ОтборЭлемента.ПравоеЗначение = Истина;
	
	Элемент.Оформление.УстановитьЗначениеПараметра("ТолькоПросмотр", Истина);
	
	ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
	ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ОтборыПараметр.Имя);
	ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
	ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ОтборыВидСравнения.Имя);
	ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
	ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ОтборыКартинкаРежимаОтображения.Имя);
	
	//
	Элемент = УсловноеОформление.Элементы.Добавить();
	
	ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Отборы.ЭтоПараметр");
	ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
	ОтборЭлемента.ПравоеЗначение = Истина;
	
	Элемент.Оформление.УстановитьЗначениеПараметра("Видимость", Ложь);
	
	ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
	ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ОтборыТипГруппы.Имя);
	ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
	ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ОтборыПоле.Имя);
	ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
	ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ОтборыПравоеЗначение.Имя);
	
	//
	Элемент = УсловноеОформление.Элементы.Добавить();
	
	ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Отборы.ЭтоПараметр");
	ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
	ОтборЭлемента.ПравоеЗначение = Истина;
	
	Элемент.Оформление.УстановитьЗначениеПараметра("Отображать", Ложь);
	
	ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
	ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ОтборыТипГруппы.Имя);
	ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
	ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ОтборыВидСравнения.Имя);
	ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
	ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ОтборыПоле.Имя);
	
	//
	Элемент = УсловноеОформление.Элементы.Добавить();
	
	ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Отборы.ЭтоПериод");
	ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
	ОтборЭлемента.ПравоеЗначение = Истина;
	
	Элемент.Оформление.УстановитьЗначениеПараметра("ТолькоПросмотр", Истина);
	Элемент.Оформление.УстановитьЗначениеПараметра("Отображать", Ложь);
	
	ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
	ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ОтборыВидСравнения.Имя);
	
	//
	Элемент = УсловноеОформление.Элементы.Добавить();
	
	ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Отборы.ОтображатьИспользование");
	ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
	ОтборЭлемента.ПравоеЗначение = Ложь;
	
	Элемент.Оформление.УстановитьЗначениеПараметра("Видимость", Ложь);
	Элемент.Оформление.УстановитьЗначениеПараметра("ТолькоПросмотр", Истина);
	Элемент.Оформление.УстановитьЗначениеПараметра("Отображать", Ложь);
	
	ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
	ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ОтборыИспользование.Имя);
	
	//
	Элемент = УсловноеОформление.Элементы.Добавить();
	
	ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Отборы.ЭтоРаздел");
	ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
	ОтборЭлемента.ПравоеЗначение = Ложь;
	
	ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Отборы.ЭтоПараметр");
	ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
	ОтборЭлемента.ПравоеЗначение = Ложь;
	
	ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Отборы.ЭтоГруппа");
	ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
	ОтборЭлемента.ПравоеЗначение = Ложь;
	
	Элемент.Оформление.УстановитьЗначениеПараметра("ТолькоПросмотр", Истина);
	
	ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
	ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ОтборыКартинкаРежимаОтображения.Имя);
	
	//
	Элемент = УсловноеОформление.Элементы.Добавить();
	
	ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Отборы.ЭтоРаздел");
	ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
	ОтборЭлемента.ПравоеЗначение = Ложь;
	
	ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Отборы.ЭтоПараметр");
	ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
	ОтборЭлемента.ПравоеЗначение = Ложь;
	
	ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Отборы.ЭтоГруппа");
	ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
	ОтборЭлемента.ПравоеЗначение = Ложь;
	
	Элемент.Оформление.УстановитьЗначениеПараметра("Видимость", Ложь);
	
	ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
	ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ОтборыПараметр.Имя);
	ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
	ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ОтборыТипГруппы.Имя);
	ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
	ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ОтборыЗначение.Имя);
	
	//
	Элемент = УсловноеОформление.Элементы.Добавить();
	
	ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Отборы.ЭтоРаздел");
	ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
	ОтборЭлемента.ПравоеЗначение = Ложь;
	
	ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Отборы.ЭтоПараметр");
	ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
	ОтборЭлемента.ПравоеЗначение = Ложь;
	
	ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Отборы.ЭтоГруппа");
	ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
	ОтборЭлемента.ПравоеЗначение = Ложь;
	
	Элемент.Оформление.УстановитьЗначениеПараметра("Отображать", Ложь);
	
	ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
	ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ОтборыПараметр.Имя);
	ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
	ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ОтборыТипГруппы.Имя);
	ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
	ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ОтборыЗначение.Имя);
	
	//
	Элемент = УсловноеОформление.Элементы.Добавить();
	
	ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Отборы.ЭтоГруппа");
	ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
	ОтборЭлемента.ПравоеЗначение = Истина;
	
	Элемент.Оформление.УстановитьЗначениеПараметра("ТолькоПросмотр", Истина);
	
	ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
	ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ОтборыТипГруппы.Имя);
	ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
	ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ОтборыКартинкаРежимаОтображения.Имя);
	
	//
	Элемент = УсловноеОформление.Элементы.Добавить();
	
	ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Отборы.ЭтоГруппа");
	ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
	ОтборЭлемента.ПравоеЗначение = Истина;
	
	Элемент.Оформление.УстановитьЗначениеПараметра("Видимость", Ложь);
	
	ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
	ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ОтборыПараметр.Имя);
	ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
	ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ОтборыПоле.Имя);
	ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
	ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ОтборыЗначение.Имя);
	
	//
	Элемент = УсловноеОформление.Элементы.Добавить();
	
	ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Отборы.ЭтоГруппа");
	ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
	ОтборЭлемента.ПравоеЗначение = Истина;
	
	Элемент.Оформление.УстановитьЗначениеПараметра("Отображать", Ложь);
	
	ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
	ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ОтборыПараметр.Имя);
	ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
	ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ОтборыПоле.Имя);
	ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
	ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ОтборыВидСравнения.Имя);
	ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
	ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ОтборыЗначение.Имя);
	ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
	ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ОтборыПравоеЗначение.Имя);
	
	//
	Элемент = УсловноеОформление.Элементы.Добавить();
	
	ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Отборы.ЭтоГруппа");
	ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
	ОтборЭлемента.ПравоеЗначение = Истина;
	
	ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Отборы.Заголовок");
	ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.НеЗаполнено;
	
	Элемент.Оформление.УстановитьЗначениеПараметра("Текст", Новый ПолеКомпоновкиДанных("Отборы.ТипГруппы"));
	
	ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
	ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ОтборыПредставлениеПользовательскойНастройки.Имя);
	
	//
	Элемент = УсловноеОформление.Элементы.Добавить();
	
	ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Отборы.ЭтоУникальныйИдентификатор");
	ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
	ОтборЭлемента.ПравоеЗначение = Истина;
	
	Элемент.Оформление.УстановитьЗначениеПараметра("ТолькоПросмотр", Истина);
	
	ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
	ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ОтборыПравоеЗначение.Имя);
	
	//
	Элемент = УсловноеОформление.Элементы.Добавить();
	
	ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Отборы.Заголовок");
	ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Заполнено;
	
	Элемент.Оформление.УстановитьЗначениеПараметра("Текст", Новый ПолеКомпоновкиДанных("Отборы.Заголовок"));
	
	ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
	ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ОтборыПараметр.Имя);
	ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
	ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ОтборыТипГруппы.Имя);
	ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
	ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ОтборыПоле.Имя);
	
	//
	Элемент = УсловноеОформление.Элементы.Добавить();
	
	ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Отборы.ПредставлениеЗначения");
	ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Заполнено;
	
	Элемент.Оформление.УстановитьЗначениеПараметра("Текст", Новый ПолеКомпоновкиДанных("Отборы.ПредставлениеЗначения"));
	
	ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
	ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ОтборыЗначение.Имя);
	ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
	ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ОтборыПравоеЗначение.Имя);
	
	//
	ЦветТекстаЗапрещеннойЯчейки = Метаданные.ЭлементыСтиля.ТекстЗапрещеннойЯчейкиЦвет;
	
	Элемент = УсловноеОформление.Элементы.Добавить();
	
	ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Отборы.ЭтоПредопределенныйЗаголовок");
	ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
	ОтборЭлемента.ПравоеЗначение = Истина;
	
	Элемент.Оформление.УстановитьЗначениеПараметра("ЦветТекста", ЦветТекстаЗапрещеннойЯчейки.Значение);
	
	ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
	ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ОтборыПредставлениеПользовательскойНастройки.Имя);
	
	#КонецОбласти
	
	#Область УсловноеОформлениеТаблицыФормыВыбранныеПоля
	

	//
	Элемент = УсловноеОформление.Элементы.Добавить();
	
	ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ВыбранныеПоля.ЭтоРаздел");
	ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
	ОтборЭлемента.ПравоеЗначение = Истина;
	
	Элемент.Оформление.УстановитьЗначениеПараметра("Видимость", Ложь);
	Элемент.Оформление.УстановитьЗначениеПараметра("Отображать", Ложь);
	
	ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
	ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ВыбранныеПоляИспользование.Имя);
	
	//
	Элемент = УсловноеОформление.Элементы.Добавить();
	
	ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ВыбранныеПоля.Заголовок");
	ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Заполнено;
	
	Элемент.Оформление.УстановитьЗначениеПараметра("Текст", Новый ПолеКомпоновкиДанных("ВыбранныеПоля.Заголовок"));
	
	ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
	ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ВыбранныеПоляПоле.Имя);
	
	#КонецОбласти
	
	#Область УсловноеОформлениеТаблицыФормыСортировка
	
	//
	Элемент = УсловноеОформление.Элементы.Добавить();
	
	ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Сортировка.ЭтоРаздел");
	ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
	ОтборЭлемента.ПравоеЗначение = Истина;
	
	Элемент.Оформление.УстановитьЗначениеПараметра("Видимость", Ложь);
	Элемент.Оформление.УстановитьЗначениеПараметра("Отображать", Ложь);
	
	ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
	ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.СортировкаИспользование.Имя);
	ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
	ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.СортировкаТипУпорядочивания.Имя);
	
	//
	Элемент = УсловноеОформление.Элементы.Добавить();
	
	ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Сортировка.ЭтоАвтоПоле");
	ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
	ОтборЭлемента.ПравоеЗначение = Истина;
	
	Элемент.Оформление.УстановитьЗначениеПараметра("Видимость", Ложь);
	Элемент.Оформление.УстановитьЗначениеПараметра("Отображать", Ложь);
	
	ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
	ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.СортировкаТипУпорядочивания.Имя);
	
	//
	Элемент = УсловноеОформление.Элементы.Добавить();
	
	ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Сортировка.Заголовок");
	ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Заполнено;
	
	Элемент.Оформление.УстановитьЗначениеПараметра("Текст", Новый ПолеКомпоновкиДанных("Сортировка.Заголовок"));
	
	ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
	ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.СортировкаПоле.Имя);
	
	#КонецОбласти
	
	#Область УсловноеОформлениеТаблицыФормыОформление
	
	Элемент = УсловноеОформление.Элементы.Добавить();

	ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
	ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ОформлениеЗаголовок.Имя);
	
	ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Оформление.ЭтоПараметрВывода");
	ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
	ОтборЭлемента.ПравоеЗначение = Истина;

	Элемент.Оформление.УстановитьЗначениеПараметра("ТолькоПросмотр", Истина);
	
	//
	Элемент = УсловноеОформление.Элементы.Добавить();

	ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
	ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ОформлениеИндексКартинкиДоступа.Имя);
	
	ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Оформление.ЭтоПараметрВывода");
	ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
	ОтборЭлемента.ПравоеЗначение = Истина;

	Элемент.Оформление.УстановитьЗначениеПараметра("Видимость", Ложь);
	
	//
	Элемент = УсловноеОформление.Элементы.Добавить();

	ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
	ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ОформлениеИспользование.Имя);
	ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
	ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ОформлениеЗаголовок.Имя);
	ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
	ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ОформлениеИндексКартинкиДоступа.Имя);
	
	ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Оформление.ЭтоРаздел");
	ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
	ОтборЭлемента.ПравоеЗначение = Истина;

	Элемент.Оформление.УстановитьЗначениеПараметра("ТолькоПросмотр", Истина);
	
	#КонецОбласти
	
	#Область УсловноеОформлениеТаблицыФормыСтруктураВарианта
	
	ШрифтВажнойНадписи = Метаданные.ЭлементыСтиля.ВажнаяНадписьШрифт.Значение;
	
	Элемент = УсловноеОформление.Элементы.Добавить();
	
	ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("СтруктураВарианта.ЭтоГруппа");
	ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
	ОтборЭлемента.ПравоеЗначение = Истина;
	
	Элемент.Оформление.УстановитьЗначениеПараметра("Шрифт", ШрифтВажнойНадписи);
	
	ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
	ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.СтруктураВариантаПредставление.Имя);

	//
	Элемент = УсловноеОформление.Элементы.Добавить();
	
	ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("СтруктураВарианта.Заголовок");
	ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Заполнено;
	
	ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("РасширенныйРежим");
	ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
	ОтборЭлемента.ПравоеЗначение = 0;
	
	Элемент.Оформление.УстановитьЗначениеПараметра("Текст", Новый ПолеКомпоновкиДанных("СтруктураВарианта.Заголовок"));
	Элемент.Оформление.УстановитьЗначениеПараметра("Шрифт", ШрифтВажнойНадписи);
	
	ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
	ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.СтруктураВариантаПредставление.Имя);
	
	//
	Элемент = УсловноеОформление.Элементы.Добавить();
	
	ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("СтруктураВарианта.ФлажокДоступен");
	ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
	ОтборЭлемента.ПравоеЗначение = Ложь;
	
	Элемент.Оформление.УстановитьЗначениеПараметра("Видимость", Ложь);
	Элемент.Оформление.УстановитьЗначениеПараметра("Отображать", Ложь);
	
	ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
	ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.СтруктураВариантаИспользование.Имя);
	
	#КонецОбласти
КонецПроцедуры

&НаСервере
Процедура ЗагрузитьНастройкиВКомпоновщик(ПараметрыЗагрузки)
	ПроверитьПараметрыЗагрузки(ПараметрыЗагрузки);
	
	ОтчетОбъект = РеквизитФормыВЗначение("Отчет");
	Если НастройкиОтчета.События.ПередЗаполнениемПанелиБыстрыхНастроек Тогда
		ОтчетОбъект.ПередЗаполнениемПанелиБыстрыхНастроек(ЭтотОбъект, ПараметрыЗагрузки);
	КонецЕсли;
	
	ДоступныеНастройки = ОтчетыСервер.ДоступныеНастройки(ПараметрыЗагрузки, НастройкиОтчета);
	
	ОбновитьНастройкиВарианта = ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры(ПараметрыЗагрузки, "ОбновитьНастройкиВарианта", Ложь);
	Если ОбновитьНастройкиВарианта Тогда
		ДоступныеНастройки.Настройки = Отчет.КомпоновщикНастроек.ПолучитьНастройки();
		Отчет.КомпоновщикНастроек.ЗагрузитьФиксированныеНастройки(Новый НастройкиКомпоновкиДанных);
		ДоступныеНастройки.ФиксированныеНастройки = Отчет.КомпоновщикНастроек.ФиксированныеНастройки;
	КонецЕсли;
	
	ОтчетыСервер.СброситьПользовательскиеНастройки(ДоступныеНастройки, ПараметрыЗагрузки);
	
	ОтчетыСервер.ЗаполнитьДополнительныеСвойства(ОтчетОбъект,
		ДоступныеНастройки.Настройки,
		КлючТекущегоВарианта,
		НастройкиОтчета.КлючПредопределенногоВарианта);
	
	Если НастройкиОтчета.События.ПередЗагрузкойНастроекВКомпоновщик Тогда
		ОтчетОбъект.ПередЗагрузкойНастроекВКомпоновщик(
			ЭтотОбъект,
			НастройкиОтчета.КлючСхемы,
			КлючТекущегоВарианта,
			ДоступныеНастройки.Настройки,
			ДоступныеНастройки.ПользовательскиеНастройки);
	КонецЕсли;
	
	НастройкиЗагружены = ОтчетыКлиентСервер.ЗагрузитьНастройки(
		Отчет.КомпоновщикНастроек,
		ДоступныеНастройки.Настройки,
		ДоступныеНастройки.ПользовательскиеНастройки,
		ДоступныеНастройки.ФиксированныеНастройки);
	
	// Установка фиксированных отборов выполняется через компоновщик, т.к. в нем наиболее полная коллекция настроек.
	// В ПередЗагрузкой в параметрах могут отсутствовать те параметры, настройки которые не переопределялись.
	Если НастройкиЗагружены
	   И ВариантыОтчетов.ДопустимоУстановитьКонтекст(ЭтотОбъект)
	   И ТипЗнч(ФормаПараметры.Отбор) = Тип("Структура") Тогда
		
		ОтчетыСервер.УстановитьФиксированныеОтборы(ФормаПараметры.Отбор, Отчет.КомпоновщикНастроек.Настройки, НастройкиОтчета);
	КонецЕсли;
	
	Если ФормаПараметры.Свойство("ФиксированныеНастройки") Тогда 
		ФормаПараметры.ФиксированныеНастройки = Отчет.КомпоновщикНастроек.ФиксированныеНастройки;
	КонецЕсли;
	
	ОтчетОбъект = РеквизитФормыВЗначение("Отчет");
	Если НастройкиОтчета.События.ПослеЗагрузкиНастроекВКомпоновщик Тогда
		ОтчетОбъект.ПослеЗагрузкиНастроекВКомпоновщик(Новый Структура);
	КонецЕсли;
	
	ОтчетыСервер.УстановитьДоступныеЗначения(ОтчетОбъект, ЭтотОбъект);
	ОтчетыСервер.ИнициализироватьПредопределенныеПараметрыВывода(НастройкиОтчета, ДоступныеНастройки.Настройки);
	
	УсловияОтборов = ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры(ПараметрыЗагрузки, "УсловияОтборов");
	Если УсловияОтборов <> Неопределено Тогда
		ПользовательскиеНастройки = Отчет.КомпоновщикНастроек.ПользовательскиеНастройки;
		Для Каждого Условие Из УсловияОтборов Цикл
			ЭлементПользовательскойНастройки = ПользовательскиеНастройки.ПолучитьОбъектПоИдентификатору(Условие.Ключ);
			Если ЭлементПользовательскойНастройки <> Неопределено Тогда 
				ЭлементПользовательскойНастройки.ВидСравнения = Условие.Значение;
			КонецЕсли;
		КонецЦикла;
	КонецЕсли;
	
	ИнициализироватьРеквизитыПредопределенныхПараметровВывода();
	КомпоновщикНастроек = Отчет.КомпоновщикНастроек;
	
	ОтчетыСервер.УстановитьУсловияОтборов(ПараметрыЗагрузки, КомпоновщикНастроек);
	
	Если ПараметрыЗагрузки.ВариантМодифицирован Тогда
		ВариантИзменен = Истина;
	КонецЕсли;
	
	Если ПараметрыЗагрузки.ПользовательскиеНастройкиМодифицированы Тогда
		ПользовательскиеНастройкиМодифицированы = Истина;
	КонецЕсли;
КонецПроцедуры

&НаСервере
Процедура ПроверитьПараметрыЗагрузки(ПараметрыЗагрузки)
	Если ТипЗнч(ПараметрыЗагрузки) <> Тип("Структура") Тогда 
		ПараметрыЗагрузки = Новый Структура;
	КонецЕсли;
	
	Если Не ПараметрыЗагрузки.Свойство("ИмяСобытия") Тогда
		ПараметрыЗагрузки.Вставить("ИмяСобытия", "");
	КонецЕсли;
	
	Если Не ПараметрыЗагрузки.Свойство("ВариантМодифицирован") Тогда
		ПараметрыЗагрузки.Вставить("ВариантМодифицирован", ВариантМодифицирован);
	КонецЕсли;
	
	Если Не ПараметрыЗагрузки.Свойство("ПользовательскиеНастройкиМодифицированы") Тогда
		ПараметрыЗагрузки.Вставить("ПользовательскиеНастройкиМодифицированы", ПользовательскиеНастройкиМодифицированы);
	КонецЕсли;
	
	Если Не ПараметрыЗагрузки.Свойство("Результат") Тогда
		ПараметрыЗагрузки.Вставить("Результат", Новый Структура);
	КонецЕсли;
	
	Если Не ПараметрыЗагрузки.Свойство("Результат") Тогда
		ПараметрыЗагрузки.Вставить("Результат", Новый Структура);
		ПараметрыЗагрузки.Результат.Вставить("РазвернутьУзлыДеревьев", Новый Массив);
	КонецЕсли;
	
	ПараметрыЗагрузки.Вставить("Прервать", Ложь);
	ПараметрыЗагрузки.Вставить("ОтчетОбъектИлиПолноеИмя", НастройкиОтчета.ПолноеИмя);
КонецПроцедуры

&НаСервере
Процедура ИнициализироватьРеквизитыПредопределенныхПараметровВывода()
	ПредопределенныеПараметры = Отчет.КомпоновщикНастроек.Настройки.ПараметрыВывода.Элементы;
	
	Объект = ПредопределенныеПараметры.Найти("TITLE");
	ВыводитьЗаголовок = Объект.Использование;
	
	ПолеВыводаЗаголовка = Элементы.Найти("ВыводитьЗаголовок");
	
	Если ПолеВыводаЗаголовка <> Неопределено Тогда 
		ПолеВыводаЗаголовка.Заголовок = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
			НСтр("ru = 'Выводить заголовок для печати: %1'"),
			?(ЗначениеЗаполнено(Объект.Значение), Объект.Значение, НСтр("ru = '<Отсутствует>'")));
	КонецЕсли;
	
	Объект = ПредопределенныеПараметры.Найти("DATAPARAMETERSOUTPUT");
	СвязанныйОбъект = ПредопределенныеПараметры.Найти("FILTEROUTPUT");
	
	ВыводитьФильтры = (Объект.Значение <> ТипВыводаТекстаКомпоновкиДанных.НеВыводить
		Или СвязанныйОбъект.Значение <> ТипВыводаТекстаКомпоновкиДанных.НеВыводить);
КонецПроцедуры

&НаСервере
Функция ПолноеИмяРеквизита(Реквизит)
	Возврат ?(ПустаяСтрока(Реквизит.Путь), "", Реквизит.Путь + ".") + Реквизит.Имя;
КонецФункции

&НаКлиентеНаСервереБезКонтекста
Функция ОписаниеТиповБезПримитивных(ИсходноеОписаниеТипов)
	ВычитаемыеТипы = Новый Массив;
	Если ИсходноеОписаниеТипов.СодержитТип(Тип("Строка")) Тогда
		ВычитаемыеТипы.Добавить(Тип("Строка"));
	КонецЕсли;
	Если ИсходноеОписаниеТипов.СодержитТип(Тип("Дата")) Тогда
		ВычитаемыеТипы.Добавить(Тип("Дата"));
	КонецЕсли;
	Если ИсходноеОписаниеТипов.СодержитТип(Тип("Число")) Тогда
		ВычитаемыеТипы.Добавить(Тип("Число"));
	КонецЕсли;
	Если ВычитаемыеТипы.Количество() = 0 Тогда
		Возврат ИсходноеОписаниеТипов;
	КонецЕсли;
	Возврат Новый ОписаниеТипов(ИсходноеОписаниеТипов, , ВычитаемыеТипы);
КонецФункции

&НаКлиенте
Процедура ОформитьСписок(Элемент, ЭлементНастройки)
	Значение = Неопределено;
	Если ТипЗнч(ЭлементНастройки) = Тип("ЗначениеПараметраНастроекКомпоновкиДанных") Тогда 
		Значение = ЭлементНастройки.Значение;
	ИначеЕсли ТипЗнч(ЭлементНастройки) = Тип("ЭлементОтбораКомпоновкиДанных") Тогда 
		Значение = ЭлементНастройки.ПравоеЗначение;
	КонецЕсли;

	Если ТипЗнч(Значение) <> Тип("СписокЗначений") Тогда 
		Возврат;
	КонецЕсли;
	
	Индекс = КомпоновщикНастроек.ПользовательскиеНастройки.Элементы.Индекс(ЭлементНастройки);
	ПутьКСписку = ПутьКДаннымЭлементов.ПоИндексу[Индекс];
	Если ПутьКСписку = Неопределено Тогда 
		Возврат;
	КонецЕсли;
	
	Список = Элементы.Найти(ПутьКСписку);
	Если ЭлементНастройки.Использование Тогда 
		Список.ЦветТекста = Новый Цвет;
	Иначе
		ПараметрКлиента = СтандартныеПодсистемыКлиент.ПараметрыРаботыКлиента();
		Список.ЦветТекста = ПараметрКлиента.ЭлементыСтиля.ТекстЗапрещеннойЯчейкиЦвет;
	КонецЕсли;
КонецПроцедуры

&НаСервере
Функция РазрешитьИзменятьУсловияОтборов()
	Если Булево(РасширенныйРежим) Тогда 
		Возврат Ложь;
	КонецЕсли;
	
	КомпоновщикНастроек = Отчет.КомпоновщикНастроек;
	
	ПользовательскиеНастройки = КомпоновщикНастроек.ПользовательскиеНастройки;
	Для Каждого ЭлементПользовательскойНастройки Из ПользовательскиеНастройки.Элементы Цикл 
		ЭлементНастройки = ОтчетыКлиентСервер.ПолучитьОбъектПоПользовательскомуИдентификатору(
			КомпоновщикНастроек.Настройки,
			ЭлементПользовательскойНастройки.ИдентификаторПользовательскойНастройки,,
			ПользовательскиеНастройки);
		
		Если ТипЗнч(ЭлементНастройки) <> Тип("ЭлементОтбораКомпоновкиДанных")
			Или ТипЗнч(ЭлементНастройки.ПравоеЗначение) = Тип("СтандартныйПериод")
			Или ЭлементНастройки.РежимОтображения = РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Недоступный Тогда 
			Продолжить;
		КонецЕсли;
		
		Возврат Истина;
	КонецЦикла;
	
	Возврат Ложь;
КонецФункции

&НаКлиенте
Процедура УстановитьМодифицированность()
	ПользовательскиеНастройкиМодифицированы = Истина;
	Если РасширенныйРежим = 1 Тогда
		ВариантИзменен = Истина;
	КонецЕсли;
КонецПроцедуры

#КонецОбласти

#Область ОбработкаПомеченныхНаУдалениеПолей

// Поиск полей, помеченных на удаление.

&НаСервере
Процедура НайтиПомеченныеНаУдалениеПоля(Знач ЭлементыСтруктуры = Неопределено)
	Если РежимИзмененияЭлементаСтруктурыНастроек Тогда 
		Возврат;
	КонецЕсли;
	
	Настройки = Отчет.КомпоновщикНастроек.Настройки;
	
	Если ЭлементыСтруктуры = Неопределено Тогда 
		ЭлементыСтруктуры = Настройки.Структура;
		
		НайтиПомеченныеНаУдалениеВыбранныеПоля(Настройки);
		НайтиПомеченныеНаУдалениеПоляОтбора(Настройки);
		НайтиПомеченныеНаУдалениеПоляПорядка(Настройки);
		НайтиПомеченныеНаУдалениеЭлементыУсловногоОформления(Настройки);
	КонецЕсли;
	
	Для Каждого ЭлементСтруктуры Из ЭлементыСтруктуры Цикл 
		ТипЭлемента = ТипЗнч(ЭлементСтруктуры);
		Если ТипЭлемента = Тип("ГруппировкаКомпоновкиДанных")
			Или ТипЭлемента = Тип("ГруппировкаТаблицыКомпоновкиДанных")
			Или ТипЭлемента = Тип("ГруппировкаДиаграммыКомпоновкиДанных") Тогда 
			
			НайтиПомеченныеНаУдалениеВыбранныеПоля(Настройки, ЭлементСтруктуры);
			НайтиПомеченныеНаУдалениеПоляОтбора(Настройки, ЭлементСтруктуры);
			НайтиПомеченныеНаУдалениеПоляПорядка(Настройки, ЭлементСтруктуры);
			НайтиПомеченныеНаУдалениеЭлементыУсловногоОформления(Настройки, ЭлементСтруктуры);
			НайтиПомеченныеНаУдалениеПоляГруппировки(Настройки, ЭлементСтруктуры);
		КонецЕсли;
		
		ИменаКоллекций = ИменаКоллекцийЭлементаСтруктуры(ЭлементСтруктуры);
		Для Каждого ИмяКоллекции Из ИменаКоллекций Цикл 
			КоллекцияЭлементаСтруктуры = ЭлементыНастроек(ЭлементСтруктуры,, ИмяКоллекции);
			НайтиПомеченныеНаУдалениеПоля(КоллекцияЭлементаСтруктуры);
		КонецЦикла;
	КонецЦикла;
	
	Обработанные = ПомеченныеНаУдаление.Выгрузить();
	Обработанные.Свернуть("ИдентификаторЭлементаСтруктуры, ИдентификаторЭлемента, КлючСвойстваЭлементаСтруктуры");
	Обработанные.Сортировать("ИдентификаторЭлементаСтруктуры Убыв, КлючСвойстваЭлементаСтруктуры, ИдентификаторЭлемента");
	
	ПомеченныеНаУдаление.Загрузить(Обработанные);
КонецПроцедуры

&НаСервере
Процедура НайтиПомеченныеНаУдалениеВыбранныеПоля(Настройки, Знач ЭлементСтруктуры = Неопределено, Группа = Неопределено)
	Если ЭлементСтруктуры = Неопределено Тогда 
		ЭлементСтруктуры = Настройки;
	КонецЕсли;
	
	СвойствоЭлементаСтруктуры = ЭлементСтруктуры.Выбор;
	ДоступныеПоля = СвойствоЭлементаСтруктуры.ДоступныеПоляВыбора;
	ТипАвтоПоля = Тип("АвтоВыбранноеПолеКомпоновкиДанных");
	ТипГруппы = Тип("ГруппаВыбранныхПолейКомпоновкиДанных");
	
	ЭлементыНастроек = ?(Группа = Неопределено, СвойствоЭлементаСтруктуры.Элементы, Группа.Элементы);
	Для Каждого ЭлементНастройки Из ЭлементыНастроек Цикл 
		Если ТипЗнч(ЭлементНастройки) = ТипГруппы Тогда 
			НайтиПомеченныеНаУдалениеВыбранныеПоля(Настройки,  ЭлементСтруктуры, ЭлементНастройки);
			Продолжить;
		КонецЕсли;
		
		Если ТипЗнч(ЭлементНастройки) = ТипАвтоПоля
			Или ДоступныеПоля.НайтиПоле(ЭлементНастройки.Поле) <> Неопределено Тогда 
			Продолжить;
		КонецЕсли;
		
		Запись = ПомеченныеНаУдаление.Добавить();
		Запись.ИдентификаторЭлементаСтруктуры = Настройки.ПолучитьИдентификаторПоОбъекту(ЭлементСтруктуры);
		Запись.ИдентификаторЭлемента = СвойствоЭлементаСтруктуры.ПолучитьИдентификаторПоОбъекту(ЭлементНастройки);
		Запись.КлючСвойстваЭлементаСтруктуры = "Выбор";
	КонецЦикла;
КонецПроцедуры

&НаСервере
Процедура НайтиПомеченныеНаУдалениеПоляОтбора(Настройки, Знач ЭлементСтруктуры = Неопределено, Группа = Неопределено)
	Если ЭлементСтруктуры = Неопределено Тогда 
		ЭлементСтруктуры = Настройки;
	КонецЕсли;
	
	СвойствоЭлементаСтруктуры = ЭлементСтруктуры.Отбор;
	ДоступныеПоля = СвойствоЭлементаСтруктуры.ДоступныеПоляОтбора;
	ТипГруппы = Тип("ГруппаЭлементовОтбораКомпоновкиДанных");
	
	ЭлементыНастроек = ?(Группа = Неопределено, СвойствоЭлементаСтруктуры.Элементы, Группа.Элементы);
	Для Каждого ЭлементНастройки Из ЭлементыНастроек Цикл 
		Если ТипЗнч(ЭлементНастройки) = ТипГруппы Тогда 
			НайтиПомеченныеНаУдалениеПоляОтбора(Настройки,  ЭлементСтруктуры, ЭлементНастройки);
			Продолжить;
		КонецЕсли;
		
		Если ТипЗнч(ЭлементНастройки.ЛевоеЗначение) <> Тип("ПолеКомпоновкиДанных")
			Или ДоступныеПоля.НайтиПоле(ЭлементНастройки.ЛевоеЗначение) <> Неопределено Тогда 
			Продолжить;
		КонецЕсли;
		
		Запись = ПомеченныеНаУдаление.Добавить();
		Запись.ИдентификаторЭлементаСтруктуры = Настройки.ПолучитьИдентификаторПоОбъекту(ЭлементСтруктуры);
		Запись.ИдентификаторЭлемента = СвойствоЭлементаСтруктуры.ПолучитьИдентификаторПоОбъекту(ЭлементНастройки);
		Запись.КлючСвойстваЭлементаСтруктуры = "Отбор";
	КонецЦикла;
КонецПроцедуры

&НаСервере
Процедура НайтиПомеченныеНаУдалениеПоляПорядка(Настройки, Знач ЭлементСтруктуры = Неопределено)
	Если ЭлементСтруктуры = Неопределено Тогда 
		ЭлементСтруктуры = Настройки;
	КонецЕсли;
	
	СвойствоЭлементаСтруктуры = ЭлементСтруктуры.Порядок;
	ДоступныеПоля = СвойствоЭлементаСтруктуры.ДоступныеПоляПорядка;
	ТипАвтоПоля = Тип("АвтоЭлементПорядкаКомпоновкиДанных");
	
	Для Каждого ЭлементНастройки Из СвойствоЭлементаСтруктуры.Элементы Цикл 
		Если ТипЗнч(ЭлементНастройки) = ТипАвтоПоля
			Или ДоступныеПоля.НайтиПоле(ЭлементНастройки.Поле) <> Неопределено Тогда 
			Продолжить;
		КонецЕсли;
		
		Запись = ПомеченныеНаУдаление.Добавить();
		Запись.ИдентификаторЭлементаСтруктуры = Настройки.ПолучитьИдентификаторПоОбъекту(ЭлементСтруктуры);
		Запись.ИдентификаторЭлемента = СвойствоЭлементаСтруктуры.ПолучитьИдентификаторПоОбъекту(ЭлементНастройки);
		Запись.КлючСвойстваЭлементаСтруктуры = "Порядок";
	КонецЦикла;
КонецПроцедуры

&НаСервере
Процедура НайтиПомеченныеНаУдалениеЭлементыУсловногоОформления(Настройки, Знач ЭлементСтруктуры = Неопределено)
	Если ЭлементСтруктуры = Неопределено Тогда 
		ЭлементСтруктуры = Настройки;
	КонецЕсли;
	
	СвойствоЭлементаСтруктуры = ЭлементСтруктуры.УсловноеОформление;
	
	Для Каждого ЭлементНастройки Из СвойствоЭлементаСтруктуры.Элементы Цикл 
		ДоступныеПоля = ЭлементНастройки.Поля.ДоступныеПоляОформляемыхПолей;
		Для Каждого Элемент Из ЭлементНастройки.Поля.Элементы Цикл 
			Если ДоступныеПоля.НайтиПоле(Элемент.Поле) <> Неопределено Тогда 
				Продолжить;
			КонецЕсли;
			
			Запись = ПомеченныеНаУдаление.Добавить();
			Запись.ИдентификаторЭлементаСтруктуры = Настройки.ПолучитьИдентификаторПоОбъекту(ЭлементСтруктуры);
			Запись.ИдентификаторЭлемента = СвойствоЭлементаСтруктуры.ПолучитьИдентификаторПоОбъекту(ЭлементНастройки);
			Запись.КлючСвойстваЭлементаСтруктуры = "УсловноеОформление";
		КонецЦикла;
		
		НайтиПомеченныеНаУдалениеЭлементыОтбораУсловногоОформления(Настройки, ЭлементСтруктуры, ЭлементНастройки);
	КонецЦикла;
КонецПроцедуры

&НаСервере
Процедура НайтиПомеченныеНаУдалениеЭлементыОтбораУсловногоОформления(Настройки, ЭлементСтруктуры, ЭлементОформления, Группа = Неопределено)
	СвойствоЭлементаСтруктуры = ЭлементСтруктуры.УсловноеОформление;
	
	ДоступныеПоля = ЭлементОформления.Отбор.ДоступныеПоляОтбора;
	ТипГруппы = Тип("ГруппаЭлементовОтбораКомпоновкиДанных");
	
	ЭлементыНастроек = ?(Группа = Неопределено, ЭлементОформления.Отбор.Элементы, Группа.Элементы);
	Для Каждого ЭлементНастройки Из ЭлементыНастроек Цикл 
		Если ТипЗнч(ЭлементНастройки) = ТипГруппы Тогда 
			НайтиПомеченныеНаУдалениеЭлементыОтбораУсловногоОформления(
				Настройки,  ЭлементСтруктуры, ЭлементОформления, ЭлементНастройки);
			Продолжить;
		КонецЕсли;
		
		Если ДоступныеПоля.НайтиПоле(ЭлементНастройки.ЛевоеЗначение) <> Неопределено Тогда 
			Продолжить;
		КонецЕсли;
		
		Запись = ПомеченныеНаУдаление.Добавить();
		Запись.ИдентификаторЭлементаСтруктуры = Настройки.ПолучитьИдентификаторПоОбъекту(ЭлементСтруктуры);
		Запись.ИдентификаторЭлемента = СвойствоЭлементаСтруктуры.ПолучитьИдентификаторПоОбъекту(ЭлементОформления);
		Запись.КлючСвойстваЭлементаСтруктуры = "УсловноеОформление";
	КонецЦикла;
КонецПроцедуры

&НаСервере
Процедура НайтиПомеченныеНаУдалениеПоляГруппировки(Настройки, ЭлементСтруктуры)
	СвойствоЭлементаСтруктуры = ЭлементСтруктуры.ПоляГруппировки;
	ДоступныеПоля = СвойствоЭлементаСтруктуры.ДоступныеПоляПолейГруппировок;
	ТипАвтоПоля = Тип("АвтоПолеГруппировкиКомпоновкиДанных");
	
	Для Каждого ЭлементНастройки Из СвойствоЭлементаСтруктуры.Элементы Цикл 
		Если ТипЗнч(ЭлементНастройки) = ТипАвтоПоля
			Или ДоступныеПоля.НайтиПоле(ЭлементНастройки.Поле) <> Неопределено Тогда 
			Продолжить;
		КонецЕсли;
		
		Запись = ПомеченныеНаУдаление.Добавить();
		Запись.ИдентификаторЭлементаСтруктуры = Настройки.ПолучитьИдентификаторПоОбъекту(ЭлементСтруктуры);
		Запись.ИдентификаторЭлемента = СвойствоЭлементаСтруктуры.ПолучитьИдентификаторПоОбъекту(ЭлементНастройки);
		Запись.КлючСвойстваЭлементаСтруктуры = "ПоляГруппировки";
	КонецЦикла;
КонецПроцедуры

&НаСервере
Функция ИменаКоллекцийЭлементаСтруктуры(Элемент)
	ИменаКоллекций = "";
	
	ТипЭлемента = ТипЗнч(Элемент);
	Если ТипЭлемента = Тип("ГруппировкаКомпоновкиДанных")
		Или ТипЭлемента = Тип("ГруппировкаТаблицыКомпоновкиДанных")
		Или ТипЭлемента = Тип("ГруппировкаДиаграммыКомпоновкиДанных")
		Или ТипЭлемента = Тип("НастройкиВложенногоОбъектаКомпоновкиДанных")
		Или ТипЭлемента = Тип("КоллекцияЭлементовСтруктурыНастроекКомпоновкиДанных") Тогда 
		
		ИменаКоллекций = "Структура";
		
	ИначеЕсли ТипЭлемента = Тип("ТаблицаКомпоновкиДанных")
		Или ТипЭлемента = Тип("КоллекцияЭлементовСтруктурыТаблицыКомпоновкиДанных") Тогда 
	
		ИменаКоллекций = "Строки,Колонки";
		
	ИначеЕсли ТипЭлемента = Тип("ДиаграммаКомпоновкиДанных")
		Или ТипЭлемента = Тип("КоллекцияЭлементовСтруктурыДиаграммыКомпоновкиДанных") Тогда 
		
		ИменаКоллекций = "Точки,Серии";
		
	КонецЕсли;
	
	Возврат СтрРазделить(ИменаКоллекций, ",");
КонецФункции

&НаСервере
Функция ПредставлениеКоллекцииЭлементаСтруктуры(ИмяКоллекции)
	
	ПредставлениеКоллекций = Новый Соответствие;
	ПредставлениеКоллекций.Вставить("Структура", НСтр("ru = 'Структура'"));
	ПредставлениеКоллекций.Вставить("Строки", НСтр("ru = 'Строки'"));
	ПредставлениеКоллекций.Вставить("Колонки", НСтр("ru = 'Колонки'"));
	ПредставлениеКоллекций.Вставить("Точки", НСтр("ru = 'Точки'"));
	ПредставлениеКоллекций.Вставить("Серии", НСтр("ru = 'Серии'"));
	
	Возврат ПредставлениеКоллекций[ИмяКоллекции];
	
КонецФункции

// Удаление полей, помеченных на удаление.

&НаКлиенте
Процедура УдалитьПомеченныеНаУдалениеПоля()
	КомпоновщикНастроек = Отчет.КомпоновщикНастроек;
	
	Для Каждого Запись Из ПомеченныеНаУдаление Цикл 
		СвойствоЭлементаСтруктуры = СвойствоЭлементаСтруктурыНастроек(
			КомпоновщикНастроек, Запись.КлючСвойстваЭлементаСтруктуры, Запись.ИдентификаторЭлементаСтруктуры, РасширенныйРежим);
		Если СвойствоЭлементаСтруктуры = Неопределено Тогда 
			Продолжить;
		КонецЕсли;
		
		ЭлементНастройки = СвойствоЭлементаСтруктуры.ПолучитьОбъектПоИдентификатору(Запись.ИдентификаторЭлемента);
		Если ЭлементНастройки = Неопределено Тогда 
			Продолжить;
		КонецЕсли;
		
		РодительЭлементаНастройки = ПолучитьРодителяЭлементаНастройки(СвойствоЭлементаСтруктуры, ЭлементНастройки);
		ЭлементыНастроек = ЭлементыНастроек(СвойствоЭлементаСтруктуры, РодительЭлементаНастройки);
		ЭлементыНастроек.Удалить(ЭлементНастройки);
		
		Если ЭлементыНастроек.Количество() = 0
			И ТипЗнч(РодительЭлементаНастройки) = Тип("ПоляГруппировкиКомпоновкиДанных") Тогда 
			
			ЭлементСтруктуры = КомпоновщикНастроек.Настройки.ПолучитьОбъектПоИдентификатору(Запись.ИдентификаторЭлементаСтруктуры);
			Если ТипЗнч(ЭлементСтруктуры) = Тип("ГруппировкаКомпоновкиДанных") Тогда 
				ЭлементыСтруктуры = ЭлементСтруктуры.Структура;
				Если ЭлементыСтруктуры.Количество() = 0 Тогда 
					Продолжить;
				КонецЕсли;
				
				Индекс = ЭлементыСтруктуры.Количество() - 1;
				Пока Индекс >= 0 Цикл 
					ЭлементыСтруктуры.Удалить(ЭлементыСтруктуры[Индекс]);
					Индекс = Индекс - 1;
				КонецЦикла;
			Иначе // ГруппировкаТаблицыКомпоновкиДанных или ГруппировкаДиаграммыКомпоновкиДанных.
				РодительЭлементаСтруктуры = ПолучитьРодителяЭлементаНастройки(СвойствоЭлементаСтруктуры, ЭлементСтруктуры);
				ИмяКоллекции = ИмяКоллекцииНастроекПоИдентификатору(Запись.ИдентификаторЭлементаСтруктуры);
				ЭлементыСтруктуры = ЭлементыНастроек(СвойствоЭлементаСтруктуры, РодительЭлементаСтруктуры, ИмяКоллекции);
				ЭлементыСтруктуры.Удалить(ЭлементСтруктуры);
			КонецЕсли;
		КонецЕсли;
	КонецЦикла;
	
	УстановитьМодифицированность();
КонецПроцедуры

#КонецОбласти

// АПК:568-выкл выполняет задачу адаптации кода (исправление проблем типизации).

// Параметры:
//  Коллекция - ДанныеФормыДерево
//
// Возвращаемое значение:
//  ДанныеФормыЭлементДерева:
//    * Идентификатор - ИдентификаторКомпоновкиДанных
//    * Использование - Булево
//    * ОтображатьИспользование - Булево
//    * ПредставлениеПользовательскойНастройки - Строка
//    * ВидСравнения - ВидСравненияКомпоновкиДанных
//    * Значение - Неопределено
//    * ПредставлениеЗначения - Строка
//    * ТипЗначения - ОписаниеТипов
//    * ДоступныеЗначения - СписокЗначений
//    * ДоступенСписокЗначений - Булево
//    * КартинкаРежимаОтображения - Число
//    * Заголовок - Строка
//    * ЭтоПредопределенныйЗаголовок - Булево
//    * ЭтоРаздел - Булево
//    * ЭтоГруппа - Булево
//    * ЭтоПараметр - Булево
//    * ЭтоПериод - Булево
//    * Картинка - Число
//    * ФормаВыбора - Строка
//    * ВыборГруппИЭлементов - ИспользованиеГруппИЭлементов
//    * ДоступныеВидыСравнения - СписокЗначений
//    * Параметр - ПараметрКомпоновкиДанных
//    * ЛевоеЗначение - ПолеКомпоновкиДанных
//    * ПравоеЗначение - Неопределено
//    * ПометкаУдаления - Булево
//    * ЭтоУникальныйИдентификатор - Булево
//
&НаКлиентеНаСервереБезКонтекста
Функция ЭлементКоллекцииФормыНастроек(Коллекция)
	
	Если Коллекция.ПолучитьЭлементы().Количество() = 0  Тогда
		Возврат Неопределено;
	КонецЕсли;
	
	Возврат Коллекция.ПолучитьЭлементы()[0];
	
КонецФункции

// АПК:568-вкл

#Область ОпределениеДанныхВыбораЭлементаОтбора

&НаКлиенте
Процедура ОпределитьДанныеВыбораЭлементаОтбораПоЗапросу(ИсходныйЗапрос, ДанныеВыбора, ДоступныеПоля, Запрос = Неопределено, Родитель = Неопределено, Индекс = 0)
	
	Если ДанныеВыбора = Неопределено Тогда 
		ДанныеВыбора = Новый СписокЗначений;
	КонецЕсли;
	
	Если Запрос = Неопределено Тогда 
		Запрос = ИсходныйЗапрос;
	КонецЕсли;
	
	ОписаниеЗапроса = СтрРазделить(Запрос, ".", Ложь);
	
	Если СтрЗаканчиваетсяНа(Запрос, ".") Тогда 
		ОписаниеЗапроса.Добавить(". ");
	КонецЕсли;
	
	Пока Индекс <= ОписаниеЗапроса.ВГраница() Цикл 
		
		ФрагментЗапроса = СокрЛП(ОписаниеЗапроса[Индекс]);
		ДочерниеЭлементы = ?(Родитель = Неопределено, ДоступныеПоля.Элементы, Родитель.Элементы);
		
		Если Индекс = ОписаниеЗапроса.ВГраница() Тогда 
			
			ЗаполнитьДанныеВыбораЭлементаОтбора(ИсходныйЗапрос, ДочерниеЭлементы, ДанныеВыбора);
			
		ИначеЕсли ДанныеВыбора.Количество() = 0 Тогда 
			
			ПутьКДанным = ФрагментЗапроса;
			
			Если Родитель <> Неопределено Тогда 
				ПутьКДанным = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
					"%1.%2", Родитель.Поле, ФрагментЗапроса);
			КонецЕсли;
			
			Поле = Новый ПолеКомпоновкиДанных(ПутьКДанным);
			НайденноеПоле = ДоступныеПоля.НайтиПоле(Поле);
		
			Если НайденноеПоле = Неопределено Тогда 
				НайденноеПоле = ДоступноеПолеОтбораПоЗаголовку(ФрагментЗапроса, ДочерниеЭлементы);
			КонецЕсли;
			
			ОписаниеЗапроса.Удалить(Индекс);
			НовыйЗапрос = СтрСоединить(ОписаниеЗапроса, ".");
			ОпределитьДанныеВыбораЭлементаОтбораПоЗапросу(
				ИсходныйЗапрос, ДанныеВыбора, ДоступныеПоля, НовыйЗапрос, НайденноеПоле, Индекс);
			
		КонецЕсли;
		
		Индекс = Индекс + 1;
		
	КонецЦикла;
	
КонецПроцедуры

&НаКлиенте
Процедура ЗаполнитьДанныеВыбораЭлементаОтбора(ИсходныйЗапрос, ДочерниеЭлементы, ДанныеВыбора)
	
	Для Каждого Элемент Из ДочерниеЭлементы Цикл 
		
		Если Не Элемент.Папка
			И Не Элемент.Таблица
			И СтрНачинаетсяС(ВРег(Элемент.Заголовок), ВРег(ИсходныйЗапрос)) Тогда 
			
			ПредставлениеЭлемента = ПредставлениеЭлементаОтбора(Элемент, ИсходныйЗапрос);
			ДанныеВыбора.Добавить(Элемент.Поле, ПредставлениеЭлемента);
		КонецЕсли;
		
	КонецЦикла;
	
КонецПроцедуры

&НаКлиенте
Функция ПредставлениеЭлементаОтбора(ЭлементОтбора, ИсходныйЗапрос)
	
	НачалоЗапроса = СтрНайти(ВРег(ЭлементОтбора.Заголовок), ВРег(ИсходныйЗапрос));
	КонецЗапроса = НачалоЗапроса + СтрДлина(ИсходныйЗапрос);
	ДлинаНайденногоФрагмента = ?(НачалоЗапроса = 0, 0, СтрДлина(ИсходныйЗапрос));
	
	ФрагментДоЗапроса = Лев(ЭлементОтбора.Заголовок, НачалоЗапроса - 1);
	ФрагментЗапроса = ФрагментЗапросаЭлементаОтбора(Сред(ЭлементОтбора.Заголовок, НачалоЗапроса, ДлинаНайденногоФрагмента));
	ФрагментПослеЗапроса = Сред(ЭлементОтбора.Заголовок, КонецЗапроса);
	
	Возврат Новый ФорматированнаяСтрока(
		ФрагментДоЗапроса,
		ФрагментЗапроса,
		ФрагментПослеЗапроса);
	
КонецФункции

&НаКлиенте
Функция ФрагментЗапросаЭлементаОтбора(Запрос)
	
	ШаблонФрагментаЗапроса = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
		"<span style=""color: %1; font: %2"">%3</span>",
		"МоиВариантыОтчетовЦвет",
		"ВажнаяНадписьШрифт",
		Запрос);
	
#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда
	ФрагментЗапроса = СтроковыеФункции.ФорматированнаяСтрока(ШаблонФрагментаЗапроса);
#Иначе
	ФрагментЗапроса = СтроковыеФункцииКлиент.ФорматированнаяСтрока(ШаблонФрагментаЗапроса);
#КонецЕсли
	
	Возврат ФрагментЗапроса;
	
КонецФункции

&НаКлиенте
Функция ДоступноеПолеОтбораПоЗаголовку(ЗаголовокПоля, ДочерниеЭлементы)
	
	Для Каждого Элемент Из ДочерниеЭлементы Цикл 
		
		Если Не Элемент.Папка
			И Не Элемент.Таблица
			И ВРег(Элемент.Заголовок) = ВРег(ЗаголовокПоля) Тогда 
				
			Возврат Элемент;
		КонецЕсли;
		
	КонецЦикла;
	
	Возврат Неопределено;
	
КонецФункции

#КонецОбласти

&НаКлиенте
Процедура ОткрытьФормуНастроекДляТехническогоСпециалиста(ИмяСтраницы, ОбработчикЗавершения = Неопределено)
	
	ПараметрыФормы = Новый Структура;
	ОбщегоНазначенияКлиентСервер.ДополнитьСтруктуру(ПараметрыФормы, ФормаПараметры, Истина);
	ПараметрыФормы.Вставить("КлючВарианта", Строка(КлючТекущегоВарианта));
	ПараметрыФормы.Вставить("Вариант", Отчет.КомпоновщикНастроек.Настройки);
	ПараметрыФормы.Вставить("ПользовательскиеНастройки", Отчет.КомпоновщикНастроек.ПользовательскиеНастройки);
	ПараметрыФормы.Вставить("НастройкиОтчета", НастройкиОтчета);
	ПараметрыФормы.Вставить("ВариантНаименование", ВариантНаименование);
	ПараметрыФормы.Вставить("ИдентификаторЭлементаСтруктурыНастроек", ИдентификаторЭлементаСтруктурыНастроек);
	ПараметрыФормы.Вставить("ИмяСтраницы", ИмяСтраницы);
	ПараметрыФормы.Вставить("ПредставлениеВарианта", ВариантНаименование);
	ПараметрыФормы.Вставить("ВариантМодифицирован", ВариантИзменен);
	ПараметрыФормы.Вставить("ПользовательскиеНастройкиМодифицированы",
		ВариантИзменен Или ПользовательскиеНастройкиМодифицированы);
	
	Если ОбработчикЗавершения <> Неопределено Тогда
		РежимОкна = РежимОткрытияОкнаФормы.БлокироватьОкноВладельца;
	КонецЕсли;
	
	ОткрытьФорму(НастройкиОтчета.ПолноеИмя + ".ФормаВарианта", ПараметрыФормы, ВладелецФормы, , , , ОбработчикЗавершения, РежимОкна);
	
	Если ОбработчикЗавершения = Неопределено Тогда
		РезультатВыбораСформирован = Истина;
		Закрыть();
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура ПриЗакрытииФормыНастроекДляТехническогоСпециалиста(Результат, ДополнительныеПараметры) Экспорт
	
	Если ТипЗнч(Результат) = Тип("Структура") Тогда
		ОбновитьФорму(Результат);
	КонецЕсли;
	
КонецПроцедуры

#КонецОбласти